设计模式——工厂方法模式

简介: 1.工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法模式使一个类的实例化延迟到其子类。2.结构图我们先看看标准的工厂方法结构图:工厂方法模式的结构中包括四种角色:● 抽象产品(Product):抽象类或接口,负责定义具体产品必须实现的方法。
1.工厂方法模式
定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法模式使一个类的实例化延迟到其子类。
2.结构图
我们先看看标准的工厂方法结构图:

工厂方法模式的结构中包括四种角色:
● 抽象产品(Product):抽象类或接口,负责定义具体产品必须实现的方法。
● 具体产品(ConcreteProduct):如果Product是一个抽象类,那么具体产品是Product的子类;如果Product是一个接口,那么具体产品是实现Product接口的类。
● 构造者(Creator):一个接口或抽象类,构造者负责定义一个称作工厂方法的抽象方法,该方法返回具体产品类的实例。
● 具体构造者(ConcreteCreator):如果构造者是抽象类,具体构造者是构造者的子类;如果构造者是接口,具体构造者是实现构造者接口的类。具体构造者重写工厂方法,使该方法返回具体产品的实例。

3.简单工厂vs.工厂方法
我们前面说过简单工厂模式,简单工厂模式的最大优点在于工厂类中包含了必要逻辑判断,根据客户端的选择条件动态实例化相关类,对于客户端来说,去除了与具体产品的依赖;然而缺点就是当我们要添加功能类时,就必须修改工厂类,这违反了“开放-封闭”原则,使得具体产品与工厂类之间的耦合度过高,严重影响了系统的灵活性和扩展性。而在工厂方法模式中,我们不再提供一个统一的工厂类来创建所有的产品对象,而是针对不同的产品提供不同的工厂,这导致增加了很多类和方法,客户端的复杂性增加了,但是有失就有所得,这样整个工厂和产品体系都没有修改的变化,而只是扩展的变化,这完全符合“开放-封闭”原则。
某种程度上,工厂方法模式改变了我们直接用new创建对象的方式。

4.Java集合框架与工厂模式
Java集合框架中有一个重要的接口Collection,该接口中的iterator()方法就是一个工厂方法。iterator()方法返回一个实现Iterator接口类的实例,按照工厂方法模式的角色分类,Iterator接口是抽象产品角色,Collection接口是构造者,而所有实现Collection接口的类,即集合都是具体构造者。
下面写个例子
public class Application {
public static void main(String[] args) {
Collection<String> list=new ArrayList<>();
for (int i=0;i<8;i++)
list.add("list"+i);
Iterator<String> iterator=list.iterator();
while (iterator.hasNext())
System.out.println(iterator.next());

Collection<Integer> list1=new LinkedList<>();
for (int i=0;i<8;i++)
list1.add(new Integer(i));
Iterator<Integer> iterator1=list1.iterator();
while (iterator1.hasNext())
System.out.println(iterator1.next());
}
}
上例中ArrayList和LinkedList类就是具体的构造者, Iterator<String>和Iterator<Integer>是对应的产品类。
总结
工厂方法模式的主要优点如下:
● 在工厂方法模式中,工厂方法用来创建客户化产品,向客户隐藏产品实例化细节,用户只需要关心所需产品对应的工厂,无须关心创建细节。
● 基于工厂角色和产品角色的多态性设计是工厂方法模式的关键,它能够让工厂可以自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部。
● 在系统中加入新产品时,无须修改抽象工厂和抽象产品提供的接口,无须修改客户端,也无须修改其他的具体工厂和具体产品,完全符合“开闭原则”。
工厂方法模式的主要缺点如下:
● 在添加新产品时,需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,有更多的类需要编译和运行,会给系统带来一些额外的开销。

● 由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度。

参考:


相关文章
|
6天前
|
设计模式 算法 安全
设计模式——模板模式
模板方法模式、钩子方法、Spring源码AbstractApplicationContext类用到的模板方法
设计模式——模板模式
|
1月前
|
设计模式
设计模式-单一职责模式
设计模式-单一职责模式
|
1月前
|
设计模式 XML 存储
【二】设计模式~~~创建型模式~~~工厂方法模式(Java)
文章详细介绍了工厂方法模式(Factory Method Pattern),这是一种创建型设计模式,用于将对象的创建过程委托给多个工厂子类中的某一个,以实现对象创建的封装和扩展性。文章通过日志记录器的实例,展示了工厂方法模式的结构、角色、时序图、代码实现、优点、缺点以及适用环境,并探讨了如何通过配置文件和Java反射机制实现工厂的动态创建。
【二】设计模式~~~创建型模式~~~工厂方法模式(Java)
|
1月前
|
设计模式 XML Java
【一】设计模式~~~创建型模式~~~简单工厂模式(Java)
文章详细介绍了简单工厂模式(Simple Factory Pattern),这是一种创建型设计模式,用于根据输入参数的不同返回不同类的实例,而客户端不需要知道具体类名。文章通过图表类的实例,展示了简单工厂模式的结构、时序图、代码实现、优缺点以及适用环境,并提供了Java代码示例和扩展应用,如通过配置文件读取参数来实现对象的创建。
【一】设计模式~~~创建型模式~~~简单工厂模式(Java)
|
1月前
|
设计模式 uml C语言
设计模式----------工厂模式之简单工厂模式(创建型)
这篇文章详细介绍了简单工厂模式,包括其定义、应用场景、UML类图、通用代码实现、运行结果、实际应用例子,以及如何通过反射机制实现对象创建,从而提高代码的扩展性和维护性。
设计模式----------工厂模式之简单工厂模式(创建型)
|
1月前
|
设计模式 uml
设计模式-------------工厂模式之工厂方法模式(创建型)
工厂方法模式是一种创建型设计模式,它通过定义一个用于创建对象的接口,让子类决定实例化哪一个类,从而实现类的实例化推迟到子类中进行,提高了系统的灵活性和可扩展性。
|
1月前
|
设计模式 测试技术 Go
[设计模式]创建型模式-简单工厂模式
[设计模式]创建型模式-简单工厂模式
|
2月前
|
设计模式 算法 Java
跟着GPT学设计模式之模板模式
模板模式是一种行为型设计模式,它定义了一个操作中的算法骨架,将一些步骤的具体实现延迟到子类中。该模式使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
44 6
|
1月前
|
设计模式 人工智能 达摩院
设计模式的基础问题之模板模式在软件开发中的优势是什么
设计模式的基础问题之模板模式在软件开发中的优势是什么
|
1月前
|
设计模式 项目管理
设计模式的基础问题之生成器模式在项目管理应用的问题如何解决
设计模式的基础问题之生成器模式在项目管理应用的问题如何解决