设计模式入门笔记 01 Creational Pattern


简单点说,设计模式就是一种解决特定问题的组织代码的方式,这种方式经过多次的验证,可以有效提高项目的可维护程度,让代码结构更加清晰。

因为是非科班菜鸡,没仔细学过,所以以cousera的design pattern为基础进行入门学习。本篇blog总结一下creational pattern相关的两种设计模式

Singleton Pattern

就是常说的单例,有的时候需要一个class只能创建一个实例(比如我们用一个class表示游戏菜单,那肯定不希望这个class能创建多个object,否则会造成冲突)。

代码

class Singleton {
    constructor() {
        
    }

    static getInstance() {
        if(!this.instance) {
            this.instance = new Singleton();
        }
        return this.instance;
    }
}

//其实用js实现singleton会有一些问题,比如constructor不能设置为private

实现singleton有这么几个要点:

  1. 私有化constructor防止直接创建对象(用java/c++会比较清晰)
  2. class内部设置一个private static变量,用来引用未来创建的对象,同时private防止对象被直接篡改,更安全
  3. 提供一个公共的访问函数(public getInstance),这是访问class实例的唯一方法

Singleton Pattern解决了什么问题?

其实课程说的比较清楚了

  1. 对于一些特殊的class,我们希望它只能创建一个obejct,否则多人参与项目时很可能造成冲突
  2. 对象只有在真正被需要时才会被创建,如果之前对象不存在,只有调用getInstance时才会进行创建操作

Factory Method Pattern

Factory Method Pattern就是提供一个批量创建object的factory,比如我们需要创建很多同类型的object,这个时候就需要工厂模式

代码

class AbstractShapeFactory{
    constructor(){
        if (new.target === AbstractShapeFactory) {
            throw new Error('不能实例化抽象类')
        }
    }

    getShape(){
        throw new Error('抽象工厂方法(getShape)不允许直接调用')
    }
}

class AbstractShape{
    constructor(name, color){
        if (new.target === AbstractShape) {
            throw new Error('不能实例化抽象类')
        }

        this.name = name
        this.color = color
    }
}

class Circle extends AbstractShape{
    constructor(name, color){
        super(name, color)
    }
}

class Rectangle extends AbstractShape{
    constructor(name, color){
        super(name, color)
    }
}

class CircleFactory extends AbstractShapeFactory{
    constructor(){
        super()
    }

    getShape(){
        return new Circle('circle', 'red')
    }
}

class RectangleFactory extends AbstractShapeFactory{
    constructor(){
        super()
    }

    getShape(name, color){
        return new Rectangle(name, color)
    }
}

class OrderShapeShop{
    constructor(){
        this.rectangleFactory = new RectangleFactory()
        this.circleFactory = new CircleFactory()
    }

    orderShape(type){
        if(type === 'circle'){
            return this.rectangleFactory.getShape('rectangle', 'blue')
        }else if(type === 'rectangle'){
            return this.circleFactory.getShape('circle', 'red')
        }
    }
}

这里用两个factory进行模拟,class OrderShapeShop就是client。

其实factory可以结合之前的singleton pattern,毕竟factory没必要有多个

Factory Method Pattern带来了什么好处

  1. 降低耦合度,class OrderShapeShop并不参与object的创建过程,他只是获取对象,就算增加新的factory代价也很小
  2. 面向接口编程(js不太能体现出这个优势)而不是面向实现,可以用一个Shape interface变量接受factory创建出的对象,就算增加新的factory也不会影响原有的代码

一点点学习体会

了解过一点以后发现设计模式是很重要的内容,但它区别于语言和框架,是一种抽象的思想/结构,而不是具体的实现。

按照我的感受,设计模式需要大量的项目和代码量作为支撑,通过cousera学习应该只算是入门,后面参与项目也要多多注意设计模式才行。


Author: Maple
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source Maple !
  TOC