设计模式之创建型设计模式——简单工厂模式

简单工厂模式

现实生活中的例子:

考虑一下,你正在建房子,你需要门。你可以穿上你的木匠衣服,带上一些木头,胶水,钉子和建造门所需的所有工具,然后开始在你的房子里建造它,或者你可以简单地打电话给工厂并把内置的门送到你这里不需要了解关于制门的任何信息或处理制作它所带来的混乱。

通俗解释:

简单工厂只是为客户端生成一个实例,而不会向客户端公开任何实例化逻辑。

维基百科:

在面向对象编程(OOP)中,工厂是用于创建其他对象的对象 - 正式工厂是一种函数或方法,它从一些方法调用返回变化的原型或类的对象,这被假定为“新”。

程序示例:

首先,我们有一个门接口并且实现这个接口。

class Door { // 模拟的接口   我们在此类中仅保留方法,移除属性,来模拟接口(接口是类要实现的方法的集合,仅声明方法而不实现方法)  或者你也可以认为一定程度上模仿了抽象类: 在抽象类中定义了抽象方法方法(具体实现交由子类).
    constructor() {
        if(new.target === Door) {
            throw new Error('接口不能实例化');
        }
    }
    getWidth() {        //get 方法交由子类实现--我们使用了 get 方法而未实现它(交由子类实现)
        if(this.width === undefined)
            throw new Error('未实现此方法')
        return this.width;
    }
    getHeight() {
        if(this.height === undefined)
            throw new Error('未实现此方法')
        return this.height;
    }
}
class WoodenDoor extends Door {
    constructor(width, height){
        super();
        this._width = width;
        this._height = height;
    }
    get width() {
        return this._width;
    }
    get height() {
        return this._height;
    }
}

然后,我们有我们门工厂,并返回门实例。

class DoorFactory {
    static makeDoor(width, height) {
        return new WoodenDoor(width, height);
    }
}

然后就可以这样使用。

let door = DoorFactory.makeDoor(100, 200);
console.log(`Width: ${door.getWidth()}`);  // Width: 100
console.log(door); // WoodenDoor { _width: 100, _height: 200 }

什么时候使用?

当创建一个对象不仅仅是一些分配而且涉及一些逻辑时,将它放在专用工厂中而不是在任何地方重复相同的代码是有意义的。