美文网首页程序员简友广场
JS设计模式之抽象工厂模式

JS设计模式之抽象工厂模式

作者: Splendid飞羽 | 来源:发表于2020-07-26 16:29 被阅读0次

定义:抽象工厂模式就是:围绕一个超级工厂类,创建其他工厂类;再围绕工厂类,创建实体类。
相较于传统的工厂模式,它多出了一个超级工厂类。

主要解决:主要解决接口选择的问题。

何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。

应用举例:比如你附件可能有一些肯德基店铺、肯德基旗下的炸鸡分类下有许多产品,但是我只想要其中的一种炸鸡,比如喜欢吃原味鸡,或者吮指鸡,有的小伙伴喜欢孜然鸡等等,这个时候抽象工厂就发挥作用了。

// 首先准备我们的实体类,还是使用之前的工厂模式的案例讲解
class Dog{
    run(){
        console.log('Dog-----')
    }
}

class Cat{
    run(){
        console.log('Cat-----')
    }
} 

// ****************************

class Male{
    run(){
        console.log('male-----')
    }
}

class Femail{
    run(){
        console.log('female-----')
    }
}

// 然后准备我们的工厂类
/*假设 Cat 和 Dog,属于 Animal 工厂的产品;Male 和 Female 属于 Person 工厂的产品。所以需要实现 2 个工厂类:Animal 和 Person。

由于工厂类上面还有个超级工厂,为了方便工厂类生产实体,工厂类应该提供生产实体的方法接口。

为了更好的约束工厂类的实现,先实现一个抽象工厂类:*/



class AbstrctFactory{
    getPersion(){
        throw new Error('请先实现子类方法')
    }
    getAnimal(){
        throw new Error('请先实现子类方法')
    }
}

// 实现了抽象工厂之后,开始我们的Persion工厂和Animal工厂的创建

class PersonFactory extends AbstrctFactory{
    getPersion(persion){
        switch (persion) {
            case 'male':
                return new Male();
            case 'female':
                return new Female();
            default:
                break;
        }
    }

    getAnimal(){
        return null;
    }
}

class AnimalFactory extends AbstrctFactory{
    getAnimal(animal){
        animal = animal.toLowerCase();
        switch (animal) {
            case 'dog':
                return new Dog();
            case 'cat':
                return new Cat();
            default:
                break;
        }
    }

    getPersion(){
        return null;
    }
}

// 最后实现我们的超级工厂类
class superFactory{
    constructor(type){
        switch (type) {
            case 'persion':
                return new PersonFactory();
            case 'animal':
                return new AnimalFactory();
            default:
                break;
        }
    }
}

// 最后开始我们的调用代码测试
// 首先我们根据抽象工厂创建persion工厂,可以获取到getPersion方法
let persion = new superFactory('persion');
// 然后根据persion工厂类便可以获取真正的persion分类个体mail与femle
let male = persion.getPersion('male');
// 最后调用子类的具体方法
male.run() // male

// 注意:最上面的抽象工厂中,如果子类工厂persion或者animal没有实现getPersion或者getAnimail方法,那么会抛出错误

// 以下为AnimalFactory测试
let animal = new superFactory('animal');
let dog = animal.getAnimal('Dog');
dog.run();

// 细心的小伙伴发现了我在创建animal工厂的时候加入了一行统一小写的代码---->  animal = animal.toLowerCase();
// 其实正常来说,为了防止报错,不管调用者传入的名称是大写还是 小写都能找到对应的方法去实例化

使用场景
1、QQ 换皮肤,一整套一起换。
2、生成不同操作系统的程序。
3、网页字体更换,UI主题更换等等

优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

相关文章

网友评论

    本文标题:JS设计模式之抽象工厂模式

    本文链接:https://www.haomeiwen.com/subject/znnwlktx.html