简单工厂模式
1. 简介
简单工厂模式实质是给工厂类传入一个参数,然后工厂根据传入的参数,动态的决定创建一个产品类(当然这些类继承自同一个父类或接口)。
2. 三种角色
工厂
负责动态的生产对象
抽象产品
工厂产生的对象的父类,或者说是工厂创建时返回的类型。
具体产品
工厂产生的目标,工厂根据传入的参数,生产出的具体产品。
3. 简单工厂模式的一种简单实现(TypeScript)
以印刷厂为例,印刷厂可以生产纸质的读物,比如书、杂志、报纸。
这里的印刷厂就是工厂。
纸质读物是抽象产品。
书、杂志、报纸是具体产品。
工厂(印刷厂)
//传入参数接口
interface produceInfo {
type: string,
name: string,
publishTime: Date
}
class Printery {
public printReadings(produce:produceInfo): Readings {
switch (produce.type) {
case 'book':
return new Book(produce.name,produce.publishTime);
case 'magazine':
return new Magazine(produce.name,produce.publishTime);
case 'newspaper':
return new Newspaper(produce.name,produce.publishTime);
default:
return null;
}
}
}
抽象产品(读物)
abstract class Readings {
readonly publishTime: Date;
readonly name: string;
protected constructor(name:string,pubTime:Date){
this.name = name;
this.publishTime = pubTime;
}
}
具体产品
class Book extends Readings {
constructor(name:string, publishTime:Date){
super(name, publishTime);
}
}
class Newspaper extends Readings {
constructor(name:string, publishTime:Date){
super(name, publishTime);
}
}
class Magazine extends Readings {
constructor(name:string, publishTime:Date){
super(name, publishTime);
}
}
4. 优点
来源于百度百科:
工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费”产品;简单工厂模式通过这种做法实现了对责任的分割,它提供了专门的工厂类用于创建对象。
客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量。
通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。
个人理解:
简单工厂模式有利于分割业务和界面。工厂模式下,需要增加产品时仅仅需要增加工厂生产抽象产品的子类以及生产的逻辑即可。连带的,这样也会带来缺陷:
缺陷
当工厂需要生产的产品较多时,逻辑复杂时,再要添加新的产品,修改起工厂生产逻辑就变得非常麻烦了。所以简单工厂仅仅适用于那些产品较少逻辑不是特别复杂的情况。