一天一种设计模式-工厂模式

163 阅读1分钟

简单工厂

例: 假如需要录入各个职业的信息。 包括name,age ,career(职业) todos(具体做啥)。 不变的部分,都有name, age, career ,todos。


var zhiye = function (name, age, career) {
        this.name = name;
        this.age =age;
        this.career = career;
        this.todos = []
    }

    zhiye.prototype.change = function () { //改变的部分
        if (this.career == '牙医') {
            this.todos = ["洗牙", '看牙齿']
        }
        if (this.career == '老师') {
            this.todos = ['讲课', '改卷子']
        }
    }

    var doctor = new zhiye('李安洁', '12', '医生');
    doctor.change();
    console.log(doctor.todos)
    var doctor = new zhiye('李式', '23', '老师');
    doctor.change()
    console.log(doctor.todos)

改简单工厂模式:

  var zhiye = function (name, dos, career, todos) {
        this.name = name;
        this.todo = dos;
        this.career = career;
        this.todos = todos;
    }

    var factory = function (name,dos,career) {
        let work;
        switch(career){
            case '牙医':
                work = ["洗牙", '看牙齿'];
                break;
            case '老师':
                work = ["讲课", '改卷子']
        }
        return new zhiye(name, dos, career,work)
    }

    var doctor = new factory('李安洁', 'todo', '牙医');
    console.log(doctor.todos)

抽象工厂

包括 抽象工厂 具体工厂 抽象产品 具体产品。

 //抽象工厂 
  class MobilePhone {  
        createOs() {   
            throw new Error('抽象工厂方法不允许直接调用')
        }
        createHardWare() {
            throw new Error('抽象工厂方法不允许调用')
        }
    }

    //具体工厂
    class FakeStarFactory extends MobilePhone {
        createOs() {
            return new AndroidOs()  
        }
        createHardWare() {
            return new QualCommHardWare()
        }
    }
    //抽象产品
    class OS {
        system() {
            throw new Error('抽象产品方法不允许直接使用')
        }
    }

    //具体产品
    class AndroidOs extends OS {
        system() {
            console.log('我会用安卓去操作硬件')
        }
    }

    class iPhoneOs extends OS {
        system() {
            console.log('我会用ios去操作硬件')
        }
    }

    class CommHardWare {
        controlHardWare() {
            throw new Error('抽象产品方法不允许直接使用')
        }
    }

    class QualCommHardWare extends CommHardWare {
        controlHardWare() {
            console.log('使用硬件1')
        }
    }
    
    

为什么要新加一个抽象产品? 而不是直接一个具体产品 。使用抽象工厂是佐证开放封闭原则的良好素材。

对拓展开放,对修改封闭。

用抽象来描述一类东西相对稳定。

屏幕截图 2022-04-03 084032.png