1.工厂方法模式
工厂方法模式(Factory Method Pattern)定义:工厂方法模式又称工厂模式,也叫虚拟构造器模式或者多态工厂模式,它属于类创建模式。在工厂方法模式中工厂父类定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
2.工厂方法模式类图
1.Product(抽象产品)
抽象产品是定义产品的接口,是工厂方法模式所创建对象的超类型,也就是产品对象的共同父类或接口。
2.ConcreteProduct(具体产品)
具体产品实现了抽象产品接口。某种类型的具体产品由专门的具体工厂所创建,它们之间一一对应。
3.Factory(抽象工厂)
在抽象工厂类中,声明了工厂方法(Factory Method),用于返回一个产品。抽象工厂是工厂方法模式的核心,它与应用层程序无关。任何在模式中创建对象的工厂类都必须实现该接口。
4.ConcreteFactory(具体工厂)
具体工厂是抽象工厂类的子类,实现了抽象工厂中定义的工厂方法,并可由客户调用,返回一个具体产品类的实例。在具体工厂类中包含与应用程序密切相关的逻辑,并且接受应用程序调用以创建产品对象。
3.示例
海尔工厂(Haier)生产海尔空调(HaierAirCondition),美的工厂(Midea)生产美的空调(MideaAirCondition) 。使用工厂方法模式描述该场景,绘制类图并编程实现。
1.类图
2.代码
<script>
// 抽象工厂类
class Factory {
createAirCondition() {}
}
// 海尔工厂类
class Haier extends Factory {
createAirCondition() {
console.log("生产海尔空调");
return new HaierAirCondition()
}
}
// 美的工厂类
class Midea extends Factory {
createAirCondition() {
console.log("生产美的空调");
return new MideaAirCondition()
}
}
// 抽象产品类
class Product {
play() {}
}
// 海尔空调类
class HaierAirCondition extends Product {
play() {
console.log("海尔兄弟正在疯狂喷冷风!!");
}
}
// 美的空调类
class MideaAirCondition extends Product {
play() {
console.log("美的咋这么行呢,这风嘎嘎凉快!!!");
}
}
</script>
4.优点
基于工厂角色和产品角色的多态性设计是工厂方法模式的关键。它能够使工厂自主确定创建何种产品对象,而如何创建这个对象的细节则封装在具体工厂内部。另一个优点是在系统加入新产品时无须修改抽象工厂和抽象产品提供的接口,无须修改客户端,也无须修改其他的具体工厂和具体产品,而只要加入一个具体工厂和具体产品即可。
5.缺点
在添加新的产品时,需要添加一个具体工厂类和具体产品类,系统中的类成对增加,在一定程度上增加了系统的复杂度,会给系统带来更多的开销。另外考虑到系统的可扩展性,需要引入抽象层,代码中均使用抽象层进行定义,会增加系统的抽象性和理解难度。