看了修言大大的小册感觉受益匪浅,所以出次读后感误人子弟为道友解惑
简单工厂模式
小明看到了小王同学的iphone6羡慕不已。突然想到我也可以造一台啊,说干就干。
const xiaoming_iphone6={
name:'xiaoming_iphone6',
color:'白色',
os:'IOS',
cpu:'APPLE'
}
小明成功的动手造出来一台iphone6,兴致冲冲的向暗恋已久的小红炫耀。小红说我想要土豪金的。小明赶快去又去做了一台土豪金的iphone6。
const xiaoming_iphone6={
name:'xiaoming_iphone6',
color:'白色',
os:'IOS',
cpu:'APPLE'
}
const xiaohong_iphone6={
name:'xiaohong_iphone6',
color:'土豪金',
os:'IOS',
cpu:'APPLE'
}
作为备胎的小明终于做好了小红的土豪金iphone6,开开心心的拿给小红。小红说我闺蜜也想要一台,闺蜜的男朋友也想要一台。小明想了想不能在这样下去了竟然当我是背锅侠竟然这么欣赏我,我一定要好好做。但是总这样也不行啊每次都要重新做,我要弄个小作坊,自己在组装一台小米明天羡慕死同事小王。
function IPhoneWorkShop(name, color){
return {
name:name,
color:color,
os:'IOS',
cpu:'APPLE'
}
}
function XiaoMiWorkShop(name, color){
return {
name:name,
color:color,
os:'IOS',
cpu:'APPLE'
}
}
const guimi = IPhoneWorkShop('guimi_IPHONE6', '白色')
const guimi_friend = IPhoneWorkShop('guimi_friend_IPHONE6', '黑色')
const xiaoming = XiaoMiWorkShop('xiaoming_xiaomi','白色')
有人可能会说为什么IOS和CUP不能传入呢? 因为在实际生活中不同的系统与硬件存在兼容性。例如MTK的芯片可以配IOS系统么,答案是我还没看到。小明那么厉害怎么可能还是备胎。
抽象工厂模式
小明突然发现了商机,我要开一个手机工厂,走向人生巅峰迎娶小红。
定义手机类
梦想当山寨机老大的备胎小明当然要复刻所有的手机,那么一个手机其实是由系统和硬件两部分组成的。那么我们就先定义一个MobilePhone类,为什么要提供createOS与createHardware两个接口呢?相当山寨机老大的小明肯定不会只做一个操作系统啊同理硬件也不会只是一个,但是要保证他们提供统一的接口,要不然要多少条流水线才能实现梦想!!!
class MobilePhone {
// 提供操作系统的接口
createOS(){
throw new Error("抽象工厂方法不允许直接调用");
}
// 提供硬件的接口
createHardware(){
throw new Error("抽象工厂方法不允许直接调用");
}
}
定义OS类
class OS {
controlHardWare() {
throw new Error('抽象产品方法不允许直接调用');
}
}
class AndroidOS extends OS {
controlHardWare() {
//此处返回没有任何意义,但实际工作中此处需要有返回值
return console.log('AndroidOS系统运转')
}
}
class AppleOS extends OS {
controlHardWare() {
//此处返回没有任何意义,但实际工作中此处需要有返回值
return console.log('AppleOS系统运转')
}
}
定义OS类
class HardWare {
operateByOrder() {
throw new Error('抽象产品方法不允许直接调用');
}
}
class QualcommHardWare extends HardWare {
operateByOrder() {
//此处返回没有任何意义,但实际工作中此处需要有返回值
return console.log('使用高通硬件模式')
}
}
class AppleHardWare extends OS {
operateByOrder() {
//此处返回没有任何意义,但实际工作中此处需要有返回值
return console.log('使用苹果硬件模式')
}
}
生产线
class IPhone extends MobilePhone {
createOS() {
// 提供ios系统实例
return new AppleOS()
}
createHardWare() {
// 提供苹果硬件实例
return new AppleHardWare()
}
}
开始生产
const myPhone = new IPhone()
const os = myPhone.createOS()
const hardWare = myPhone.createHardWare()
hardWare.operateByOrder() //启动硬件指令
os.controlHardWare() //系统开机运转
写在后面
在ES6出来之前JavaScript中并没有Class的出现,只能通过prototype原型链的方式去模拟类。而class能使编程者更好的理解工厂模式,而后续超级工厂类就是定义我要实现一个手机,后续的都通过其他方式整合的形式实现超级工厂的概念。借用罗永浩的一句话 我们都是方案整合商在那装什么孙子。