抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

抽象工厂模式: 通过对类的工厂抽象,使其业务用于对产品类簇的创建,而不负责创建某一类产品的实例。

UML类图

抽象工厂模式uml

实现:

我们将创建 AbstructMouseAbstructKeyboard 抽象类和实现这些抽象类的实体类。

// 鼠标抽象类
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。接着定义工厂类 AsusFactorLenovoFactor,这两个工厂类都是扩展了 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 里加代码,又要在具体的里面加代码。

评论