前情回顾
在实际的项目开发时, 我们面对的往往不是如此简单的工厂, 而是会面对多个工厂.
在简单工厂模式中, 如果我们再加入学生会干部, 就意味着我们需要修改我们的工厂函数. 长此以往, 我们的工厂函数会变得复杂臃肿.
回顾我们设计模式的开放封闭原则, 对扩展开放, 对修改封闭 而我们添加其他判断逻辑则是在修改它.
所以我们需要一个更加合理的方式来处理
抽象工厂模式
由于抽象最初源于 Java 等强类型静态语言, 在设计初期, 往往就需要关注类型解耦. 而 JavaScript 是一个动态类型的语言, 天然具有多态性, 但目前的 JavaScript 语法里,不支持抽象类的直接实现, 所以我们只能模拟抽象类.
实现一个生产手机的抽象工厂
一个手机生产线
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class PhoneFactory { createOs() { throw new Error('抽象工厂创建软件系统方法, 需要重写') } createHardware() { throw new Error('抽象工厂创建硬件方法, 需要重写') } }
class FakeStarFactory extends PhoneFactory { createOs() { return new IOS() } createHardware() { return new MI() } }
|
抽象出系统部分的抽象工厂
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class OS { run() { throw new Error('抽象工厂, 不允许直接调用') } }
class Ios extends OS { run() { console.log('用ios系统方式启动') } } class Android extends OS { run() { console.log('用安卓系统启动') } }
|
抽象出硬件的抽象工厂
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class Hardware { operating() { throw new Error('抽象工厂方法, 不允许直接调用') } }
class MI extends Hardware { operating() { console.log('使用小米硬件') } } class HUAWEI extends Hardware { operating() { console.log('使用华为硬件') } }
|
开始生产手机
1 2 3 4 5
| const phone = new FakeStarFactory() const phoneOs = phone.createOs() const phonrHardware = phone.createHardware() phonrHardware.operating() phoneOs.run()
|