简单工厂
例: 假如需要录入各个职业的信息。 包括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')
}
}
为什么要新加一个抽象产品? 而不是直接一个具体产品 。使用抽象工厂是佐证开放封闭原则的良好素材。
对拓展开放,对修改封闭。
用抽象来描述一类东西相对稳定。