抽象工厂模式: 通过对类的工厂抽象,使其业务用于对产品类簇的创建,而不负责创建某一类产品的实例。
UML类图
实现:
我们将创建 AbstructMouse 和 AbstructKeyboard 抽象类和实现这些抽象类的实体类。
// 鼠标抽象类
class AbstructMouse{
use(){}
}
// 键盘抽象类
class AbstructKeyboard{
use(){}
}
class Mouse {
use(){
console.log('鼠标,真好用!')
}
}
class Keyboard {
use(){
console.log('键盘,真好用!')
}
}
// 华硕家的产品
class AsusMouse extends Mouse{
constructor(name = '未知'){
super()
this.name = name
console.log("Asus鼠标被造出来了,型号:",this.name)
}
use(){
console.log("Asus产的鼠标,真好用!")
}
}
class AsusKeyboard extends Keyboard{
constructor(name = '未知'){
super()
this.name = name
console.log("Asus键盘被造出来了,型号:",this.name)
}
use(){
console.log("Asus产的键盘,真好用!")
}
}
// 联想家的产品
class LenovoMouse extends Mouse{
constructor(name = '未知'){
super()
this.name = name
console.log("Lenovo鼠标被造出来了,型号:",this.name)
}
use(){
console.log("Lenovo产的鼠标,真好用!")
}
}
class LenovoKeyboard extends Keyboard{
constructor(name = '未知'){
super()
this.name = name
console.log("Lenovo键盘被造出来了,型号:",this.name)
}
use(){
console.log("Lenovo产的键盘,真好用!")
}
}
下一步是创建抽象工厂类 AbstructPcFactor。接着定义工厂类 AsusFactor 和 LenovoFactor,这两个工厂类都是扩展了 AbstructPcFactor。
// 工厂抽象类
class AbstructPcFactor{
constructor(){
}
createMouse(name){
throw new Error("必须实现老子")
}
createKeyboard(name){
throw new Error("未实现createKeyboard")
}
}
class AsusFactor extends AbstructPcFactor{
constructor(){
super()
}
createMouse(name){
return new AsusMouse(name)
}
createKeyboard(name){
return new AsusKeyboard(name)
}
}
class LenovoFactor extends AbstructPcFactor{
constructor(){
super()
}
createMouse(name){
return new LenovoMouse(name)
}
createKeyboard(){
return new LenovoKeyboard(name)
}
}
然后创建一个工厂创造器/生成器类 FactoryProducer。
// 用于创建工厂的类
class FactoryProducer{
getFactor(type){
switch(type.toLowerCase()){
case 'asus':
return new AsusFactor()
case 'lenovo':
return new LenovoFactor()
default:
return ''
}
}
}
使用 工厂生成器(FactoryProducer) 来获取华硕厂( AsusFactor) 对象。调用华硕厂(AsusFactor)的产鼠标,产键盘方法,工厂生成器还可以生成联想厂,也可以产鼠标,产键盘
const 华硕 = new FactoryProducer().getFactor('asus')
const 华硕家的鼠标 = 华硕.createMouse("华硕1号")
const 华硕家的鼠标 = 华硕.createKeyboard("华硕2号")
华硕家的鼠标.use()
const 联想 = new FactoryProducer().getFactor('lenovo')
const 联想家的鼠标 = 联想.createMouse("联想小新")
const 联想家的鼠标 = 联想.createKeyboard("联想小旧")
联想家的鼠标.use()
新增某个产品的时候:需要创建产品抽象类,实现各种厂的产品类,每个厂分别实现创建方法,返回该厂的产品类
假设新增一个充电器:
新增某个厂的时候:需要继承Pc抽象类,实现pc抽象类中的所有方法,实现该厂的各种产品类
**优点:**当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
**缺点:**产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。