首页 > 其他分享 >设计模式二:工厂模式之简单工厂

设计模式二:工厂模式之简单工厂

时间:2023-04-17 11:32:47浏览次数:27  
标签:use 创建 模式 工厂 实例 产品 设计模式 IProduct

一、简介

1.1 什么是简单工厂模式

在软件开发中,我们经常需要根据不同的需求创建不同的对象或者实例,为了实现这一目的,我们通常会采用工厂模式。工厂模式是一种创建型模式,它提供了一种创建对象的最佳方式。

工厂模式分为简单工厂、工厂方法和抽象工厂三种,本文将重点介绍简单工厂模式。

简单工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。简单工厂模式的核心思想是定义一个工厂类,根据用户选择的条件来返回一个产品类的实例。这种模式属于创建型模式,它提供了一种创建对象的最佳方式。

1.2 简单工厂模式的组成部分

简单工厂模式包含三个主要组成部分:

  • 抽象产品类:定义产品的属性和功能。
  • 具体产品类:实现抽象产品类中定义的属性和功能。
  • 工厂类:根据用户的选择条件来创建具体产品类的实例。

1.3 简单工厂模式的应用场景

简单工厂模式适用于以下场景:

  • 需要创建的对象较少。
  • 客户端不关心对象的创建过程。
  • 客户端只知道传入工厂类的参数,而不知道具体的产品类。

1.4 简单工厂模式的优缺点

1.4.1 优点:

  • 简单工厂模式具有很好的封装性,客户端不需要知道具体的产品类。
  • 工厂类根据客户端的选择条件来创建具体产品类的实例,使得客户端代码更加简洁。

1.4.2 缺点:

  • 简单工厂模式的工厂类负责所有产品类的创建,如果产品类过多,工厂类的代码会变得很复杂。
  • 新增产品类时,需要修改工厂类的源代码,违背了开闭原则。

二、示例

我们通过一个简单的例子来说明简单工厂模式的使用。

我们将使用简单工厂模式来创建三种不同的产品:ProductA、ProductB和ProductC。

2.1 定义一个抽象产品接口

首先,我们定义一个抽象产品接口IProduct,这个接口中包含一个抽象的use()方法,留给实现类去实现。

/**
 * 定义一个抽象产品接口
 */
public interface IProduct {
	// 定义一个抽象的使用方法,留给实现类去实现
	void use();
}

2.2 定义三个具体产品A、B和C

接着,我们定义三个具体产品类ProductAProductBProductC,它们都实现了IProduct接口,并且实现了use()方法。


产品A

import com.qfx.modules.factory.model.IProduct;

/**
 * 定义一个产品A
 */
public class ProductA implements IProduct {

	@Override
	public void use() {
		// 实现了抽象产品接口定义的use方法
		System.out.println("生产 ProductA");
	}
}

产品B

import com.qfx.modules.factory.model.IProduct;

/**
 * 定义一个产品B
 */
public class ProductB implements IProduct {

	@Override
	public void use() {
		// 实现了抽象产品接口定义的use方法
		System.out.println("生产 ProductB");
	}
}

产品C

import com.qfx.modules.factory.model.IProduct;

/**
 * 定义一个产品C
 */
public class ProductC implements IProduct {

	@Override
	public void use() {
		// 实现了抽象产品接口定义的use方法
		System.out.println("生产 ProductC");
	}
}

2.3 定义一个简单工厂类

然后,我们定义一个简单工厂类SimpleFactory,这个类中包含一个静态的工厂方法createProduct(),根据传入的参数来创建不同的产品实例。在这个示例中,我们使用字符串类型的参数来区分不同的产品。

import com.qfx.modules.factory.model.IProduct;
import com.qfx.modules.factory.model.impl.ProductA;
import com.qfx.modules.factory.model.impl.ProductB;
import com.qfx.modules.factory.model.impl.ProductC;

/**
 * 工厂模式(简单工厂模式)
 */
public class SimpleFactory {
	// 定义一个静态的工厂方法,用于根据传入的参数创建不同的产品实例
	public static IProduct createProduct(String type) {
        if ("A".equals(type)) {
        	// 根据传入的参数创建产品A的实例
            return new ProductA();
        } else if ("B".equals(type)) {
        	// 根据传入的参数创建产品B的实例
            return new ProductB();
        } else if ("C".equals(type)) {
        	// 根据传入的参数创建产品B的实例
            return new ProductC();
        } else {
        	return null;
        }
    }
}

2.4 客户端调用

最后,我们编写一个测试方法test(),在这个方法中,我们使用SimpleFactory分别创建ProductAProductBProductC三个具体产品的实例,并调用它们的use()方法。

import org.springframework.stereotype.Service;

import com.qfx.modules.factory.model.IProduct;
import com.qfx.modules.factory.simpleFactory.SimpleFactory;

/**
 * 简单工厂模式测试
 */
@Service
public class SimpleFactoryDemoTest {
	
	/**
	 * 该方法类用于测试简单工厂模式的功能:
	 * 它使用SimpleFactory分别生产ProductA、ProductB、ProductC三个具体产品,并调用它们的use()方法。
	 */
	public static void main(String[] args) {
		// 根据传入参数生成产品A实例
		IProduct productA = SimpleFactory.createProduct("A");
		// 调用ProductA实例的use方法
        productA.use();
        
        // 根据传入参数生成产品B实例
        IProduct productB = SimpleFactory.createProduct("B");
        // 调用ProductB实例的use方法
        productB.use();
        
        // 根据传入参数生成产品C实例
        IProduct productC = SimpleFactory.createProduct("C");
        // 调用ProductC实例的use方法
        productC.use();
	}
}

执行结果:

设计模式二:工厂模式之简单工厂_设计模式

三、解析

在上述示例中,我们使用了简单工厂模式来创建不同的产品对象。下面是对这些代码的解析:

  • 抽象产品接口IProduct:定义了一个抽象的使用方法use(),留给具体产品类去实现。
  • 具体产品类ProductAProductBProductC:实现了IProduct接口,并实现了use()方法,用于生产不同的产品。
  • 简单工厂类SimpleFactory:包含一个静态的工厂方法createProduct(),根据传入的参数来创建不同的产品实例。
  • 测试方法test():使用SimpleFactory分别创建ProductAProductBProductC三个具体产品的实例,并调用它们的use()方法。

四、总结

简单工厂模式将对象的创建与使用分离,使得应用程序更容易维护和扩展。在使用简单工厂模式时,我们需要定义一个抽象产品接口,多个具体产品类实现这个接口,一个工厂类根据传入的参数来创建不同的产品对象。但是,它的缺点是它并没有很好地解决对象的创建问题,因为它只是将对象的创建过程移动到了工厂类中。如果我们需要创建更多的产品,那么我们需要不断地修改工厂类的代码,这会导致工厂类变得越来越复杂。



标签:use,创建,模式,工厂,实例,产品,设计模式,IProduct
From: https://blog.51cto.com/abcd/6194875

相关文章

  • 【进阶12】【自学笔记】Python单例模式实现的几种方式
    一、单例模式定义单例模式是一种常用的创建型设计模式,它保证一个类只有一个实例,并提供一个全局的访问点。二、实例展示实例1:classSingleton:_instance=Nonedef__new__(cls):ifcls._instanceisNone:cls._instance=super().__new__(......
  • 今天100%胜率,模式是做空涨幅前列以及快速涨速的票
    凌晨猛冲的票容易亏缓慢上涨的票不好空最多亏了90刀,因为op前期有上涨,前两天多CFX爆仓了,形态和op差不多,所以感觉它会跌,没有止损。ONTNEOWOO这个票是最可惜的,一直拿着,今天赚50个点收益【选票逻辑】:它和ARB在前两天是涨幅第一第二名的兄弟票,早上9点多ARB大......
  • 策略模式
    概述《设计模式》一书中对于“策略模式”的意图描述如下:定义一系列算法,将它们一个个封装起来,并是他们可以相互替代一般策略模式的UML图如下所示:一般在以下几种情况中使用策略模式:许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类......
  • Day07-设计模式之桥接模式
    桥接模式介绍桥接模式(BridgePattern)是将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变,保持各部分的独立性以及应对他们的功能扩展。UML类图及角色职责抽象类(Abstraction):定义抽象接口,由聚合关系可知,抽象类中包含一个Implementor类型的对象,它与Implementor......
  • Day08-设计模式之装饰者模式
    设计模式之装饰者模式引例需求:假设现在有烧饵块:白米饵块(WhiteRice),紫米饵块(PurpleRice),黄米饵块(yellowRice),调料有热狗(HotDog),油条(oilNoodle),鸡柳(chicken),客户可以单点白米的,或者白米+调料的组合,计算相应的费用,要求在扩展饵块种类的时候,具有良好的扩展性,改动维护方便。一般解法方......
  • Day09-设计模式之组合模式
    设计模式之组合模式引例在现实生活中,存在很多“部分-整体”的关系,例如,大学中的学院与系、总公司中的分公司与部门,文件系统中的文件与文件夹等。对这些简单对象与复合对象的处理,如果用组合模式来实现会很方便。组合模式介绍组合模式定义如下:组合模式(CompositePattern)也称为......
  • 关于敏捷开发、系统重构、设计原则、设计模式之间的思考
    敏捷开发、系统重构、设计模式是软件开发中不同的概念,它们之间有一些联系和相互影响。敏捷开发方法强调快速响应客户需求,通过迭代和增量的方式来开发软件。在敏捷开发中,设计模式可以被用来提高软件质量和可维护性,因为设计模式是已经被证明有效的软件设计方案。在开发过程中,团队可......
  • docker网络模式
    Docker有4种网络模式(--network=)bridge默认模式,分配networknamespace和IP,连接到docker0网桥上。host使用主机IP,不分配networknamespace和IP,和宿主机共用networknamespace。container和已存在的某个容器共享networknamespace,不分配IP。k8s的业务容器采用Docker的container网......
  • Golang - Option模式(2)(函数选项模式)
    函数式选项模式(FunctionalOptionsPattern)函数式选项模式是一种在Go中构造结构体的模式,它通过设计一组非常有表现力和灵活的API来帮助配置和初始化结构体。优缺点选项模式有很多优点,例如:支持传递多个参数并且在参数发生变化时保持兼容性;支持任意顺序传递参数;支持默认值;方......
  • 状态模式
    概述《设计模式》一书中对于“状态模式”的描述如下:允许一个对象在其内部状态发生改变时改变它的行为,使得这个对象看起来像修改了它的类状态模式的UML图如下所示:一般在以下几种情况下使用状态模式:一个对象的行为取决于它的状态一个操作中含有庞大的多分支条件语句,且......