学习JavaScript 设计模式 - 工厂模式

1,118

查阅资料发现设计模式大致可以分成三类:

创建型模式 ( Creational Patterns )

这类设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式, 而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活, 典型的有工厂模式(Factory Pattern)、单例模式

结构型模式(Structural Patterns)

这类设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。 比如 装饰器模式(Decorator Pattern) 和 代理模式(Proxy Pattern)

行为型模式(Behavioral Patterns)

这类设计模式特别关注对象之间的通信。 比如 观察者模式(Observer Pattern)

工厂模式(Factory Pattern)是最常用的设计模式之一, 在工厂模式下,客户不需要关心产品制作过程, 只需要简单输入几个需求就行, 如果没有需求属性,新增也很方便

创建基类

class Shoe {
    constructor(size, color) {
        this.size = size  //鞋子尺寸
        this.color = color  //鞋子颜色  
    }
    
    //大家都知道鞋子上都有铭牌介绍
    introduction() {
        console.log(`我是一双 ${this.size}${this.color} 的鞋 `)
    }
}

继承基类

class Nike extends Shoe {
    constructor(...args) {
        super(...args)
    }
}

class Adidas extends Shoe { 
    //create() {}
}

class NewBalance extends Shoe {
    //create() {}
}

搭建工厂

接下来创建工厂, 这里就以莆田为例创建一个高仿 假鞋 工厂

class PuTian {
    constructor(name) {
        this.name = name 
    }
    
    //下订单
    order(size, color) {
        switch (this.name) {
            case 'Nike':
                return new Nike(size, color);
            case 'Adidas':
                return new Adidas(size, color);
            case 'NewBalance':
                return new NewBalance( size, color);
            case '回力':
                return '这个牌子利润太低我做不了!!!'
        }
    }   
}

看到这,大家应该感觉到了, 平时开发中可能无形中用过很多次工厂模式了

向工厂下单

这时候来订单了, 客户提需求了, 比如想定做 一双 阿迪达斯莆田鞋


const newShoe = new PuTian('Adidas').order(42, '蓝色')

//拿到鞋我们打印下真伪

newShoe.introduction()  

当然一般人工厂不接受1双定制, 比如 500双起 做, 所以我们需要拓展下功能

//我们可以直接在基类里添加一个定制数量的方法

class Shoe {
    constructor(size, color) {
        this.size = size  //鞋子尺寸
        this.color = color  //鞋子颜色  
    }
    
    //大家都知道鞋子上都有铭牌介绍
    introduction() {
        console.log(`我是一双 ${this.size}${this.color} 的鞋 `)
    }
    
    make(pairs) {
        let i = 0;
        while(i < pairs) {
            //机器重复做500双鞋
            i++
        }
    }
}

设置数量

    const newShoe = new PuTian('Adidas').order(42, '蓝色')
    newShoe.make(500)
    
    //是不是看起来挺方便的

抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。

    abstract class AbstractFactory { 
        
    }

其它语言可以用abstract 创建抽象方法, 但是js 目前abstract还只是保留字, 并且这个方法比较难理解,这里暂时不介绍了, 以后有机会再更新

什么时候用

作为一种创建类模式,在需要生成复杂对象的地方,都可以使用工厂模式。 而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。

最后的轻语

我以前一直好奇为什么有人在 咖啡厅 这种嘈杂环境下办公学习, 后来才知道 心理学里面有一种概念叫 “ 心流(将人的精神完全投入到某种事情上) ” ,要让自己进入这种状态, 有些人在咖啡厅可能在锻炼这种能力, 不管外界发生啥了, 都要把眼前事情做好