设计模式指导思想:找到不同场景下,需求容易发生变化的地方,把这一部分变化的逻辑封装起来。
创造型设计模式一共有5种:工厂模式、抽象工厂、单例模式、创造者模式、原型模式。本文我们介绍工厂模式。
工厂模式
作用
工厂模式通常是把实际子类型的创建逻辑封装在工厂方法中,通过调用工厂方法决定返回具体的子类型。当对象创建过程比较复杂的时候我们通常使用工厂模式封装其创建过程。
工厂模式有两种常见实现方式:简单工厂、工厂方法。
简单工厂-实现步骤
- 定义具体业务接口或抽象类。
- 定义具体业务多个子类(实现类)。
- 定义工厂方法,在工厂方法中完成返回某个子类的逻辑判断。
- 调用工厂方法,获得具体子类。示例:
/**
* 产品接口
*/
export interface Product{
method(params:any): any
}
/**
* 产品A
*/
export class ProductA implements Product{
method(params: any) {
return 'ProductA!'
}
}
/**
* 产品B
*/
export class ProductB implements Product{
method(params: any) {
return 'ProductB!'
}
}
/**
* 工厂函数。
* 封装创建产品的逻辑
*/
export class ProductFactory {
createProduct(params: any){
if(params.type === 'A'){
return new ProductA()
}else if(params.type === 'B'){
return new ProductB()
}
}
}
工厂方法-实现步骤
- 定义具体业务接口或抽象类。
- 定义具体业务的多个子类。
- 定义工厂接口或抽象类。
- 实现不同类型的工厂方法(可以和业务子类一一对应)。
- 客户端根据条件调用合适的实际工厂方法。示例:
/**
* 产品接口
*/
export interface Product{
method(params:any): any
}
/**
* 产品A
*/
export class ProductA implements Product{
method(params: any) {
return 'ProductA!'
}
}
/**
* 产品B
*/
export class ProductB implements Product{
method(params: any) {
return 'ProductB!'
}
}
/**
* 工厂接口
*/
export interface AbstractFactory{
createProduct(params: any): Product
}
/**
* 生产ProductA的工厂
*/
export class ProductAFactory{
createProduct(params: any): Product{
return new ProductA()
}
}
/**
* 生产ProductB的工厂
*/
export class ProductBFactory{
createProduct(params: any): Product{
return new ProductB()
}
}
/**
* 调用方
*/
export class Client{
main(params: any){
if(params.type === 'A'){
return new ProductA()
}else if(params.type === 'B'){
return new ProductB()
}
return
}
}
副作用
- 工厂方法并没有解决客户端根据不同条件创建不同对象的封装问题。
- 引入了很多子类。
总结
本文我们主要介绍了工厂模式解决的问题和使用方法。在实际开发中,往往需要简单工厂和工厂方法结合使用。