工厂方法模式概述
假设我们需要开发的软件中包含了不同的按钮类型,此时我们需要一个按钮工厂去生产不同类型的按钮。如果使用简单工厂模式进行设计,当面对新的需求时,比如增加一个椭圆形按钮类,我们就必须修改当前创造的按钮工厂中的源代码,这显然是违背前一部分中所提及的开闭原则的。
因此,我们引入工厂方法模式,使用一个抽象工厂类来生产出不同的具体工厂,再使用具体工厂类对产品进行生产。即可避免需求改变时需要修改工厂类的麻烦。
工厂方法模式的定义:定义一个用于创建对象的接口,但是让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。
- 简称为工厂模式(Factory Pattern)。
- 又可称作虚拟构造器模式(Virtual Constructor Pattern)或多态工厂模式(Polymorphic Factory Pattern)。
- 工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象。
- 目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
工厂方法模式的结构与实现
工厂方法模式的结构
工厂方法模式包含以下4个角色:
- Product(抽象产品)
- ConcreteProduct(具体产品)
- Factory(抽象工厂)
- ConcreteFactory(具体工厂)
工厂方法模式的实现
与简单工厂模式相比,方法模式最重要的特点是引入了抽象工厂角色,抽象工厂可以是接口,也可以是抽象类或者具体类。
典型的抽象工厂类代码:
public interface Factory {
public Product factoryMethod();
}
在实际使用时,具体工厂类在实现工厂方法时除了创建具体产品对象之外,还可以负责产品对象的初始化工作以及一些资源和环境配置工作,例如连接数据库、创建文件等。
典型的具体工厂类代码:
public class ConcreteFactory implements Factory {
public Product factoryMethod() {
return new ConcreteProduct();
}
}
典型的客户端代码片段:
Factory factory;
factory = new ConcreteFactory(); //可通过配置文件和反射机制实现
Product product;
product = factory.factoryMethod();
工厂方法模式的优缺点与适用环境
模式优点
- 工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节。
- 能够让工厂自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部。
- 在系统中加入新产品时,完全符合开闭原则。
模式缺点
- 系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,会给系统带来一些额外的开销。
- 增加了系统的抽象性和理解难度。
模式适用环境
- 客户端不知道它所需要的对象的类(客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可,具体产品对象由具体工厂类创建)。
- 抽象工厂类通过其子类来指定创建哪个对象。
发表回复
要发表评论,您必须先登录。