工厂方法模式是简单工厂模式的延申,他继承了简单工厂模式的优点,同时还弥补了简单工厂模式的缺陷,更好的符合开闭原则的要求,在增加新的具体产品对象时不需要对已有的系统做任何的修改。
什么是工厂方法
工厂方法模式简称为工厂模式,又可称作虚拟构造器模式或多态工厂模式。工厂方法模式是种类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类负责生成具体的产品对象,这样做的目的是将产品类的实例操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
工厂方法模式是一种创建型设计模式,其在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型。
工厂方法模式建议使用特殊的工厂方法代替对于对象构造函数的直接调用,对象仍将通过new
运算符创建, 只是该运算符改在工厂方法中调用罢了。 工厂方法返回的对象通常被称作”产品“。
工厂方法优缺点
工厂方法模式是使用频率最高的设计模式之一,是很多开源框架和API
类库的核心模式。作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过new
就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。
优点
- 只需要关心产品对应的工厂
- 添加新产品是只要添加一个具体工厂和具体产品
- 可扩展性非常好,完全符合开闭原则
缺点
- 类个数成倍的增加
- 抽象层进行定义,增加了系统的抽象性和理解难度
示例
工厂方法主要包含4
个类,分别是:
- 产品类
- 具体产品类
- 创建者类
- 具体创建者类
产品类主要为工厂方法提供抽象的方法具体方法由产品内部实现,然而创建者类(抽象工厂)也是同理主要负责提供创建方法具体由具体创建者类(工厂方法)内部实现。
类图如下所示:
代码示例
// 抽象产品接口(产品类)
interface Product2{
method1() : void;
method2() : void;
}
// 具体产品一(具体产品类)
class ConcreteProduct_1 implements Product2 {
constructor(){}
method1() {
// 具体业务代码
}
method2() {
// 具体业务代码
}
}
// 具体产品二(具体产品类)
class ConcreteProduct_2 implements Product2 {
constructor(){}
method1() {
// 具体业务代码
}
method2() {
// 具体业务代码
}
}
// 抽象工厂(创建者类)
abstract class Creator {
public abstract createProduct(type : number) : Product;
}
// 具体工厂(具体创建者类)
class ConcreteCreator extends Creator {
constructor(){
super();
}
public createProduct(type : number) : Product {
let product = null;
if (type === 1) {
product = new ConcreteProduct_1();
} else if (type === 2) {
product = new ConcreteProduct_2();
}
return product;
}
}
// 使用
const creator:Creator = new ConcreteCreator();
const myProduct:Product = creator.createProduct(1);
总结
如果你希望复用现有对象来节省系统资源,而不是每次都重新创建对象,可使用工厂方法。在处理大型资源密集型对象时,你会经常碰到这种资源需求。在抽象工厂中可以声明多个抽象的工厂方法,在具体工厂中实现了这些工厂方法,这些方法可以包含不同的业务逻辑,以满足产品对象的多样化创建需求。
在工厂类中可以直接调用产品类的业务方法,客户端无须调用工厂方法创建产品对象,直接使用工厂对象即可调用所创建的产品对象中的业务方法,实现对工厂方法的隐藏。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。