javascript设计模式(三)

289

继续记录一些javascript设计模式,后续有时间再完善一遍,形成一个整体。

工厂模式

一个抽象工厂创建的是与一些公共主题相关的对象,在面向对象编程中,Factory是创建其它对象的对象,抽象工厂创建了一个公共主题,这个主题被它所创建的对象共享。

你可能会迷惑为什么把创建对象的过程留给Factory而不是直接new一下构造函数,原因是new构造函数对创建过程的控制是有限的,有时候需要将对象创建的控制权交给有更加广泛能力的Factory

这里的能力可能包括以下场景:创建过程涉及到对象缓存、对象共享或者重用,其它复杂逻辑以及不同设备交互的对象。如果应用程序需要更多的控制对象创建过程,可以考虑使用Factory

图解

image.png

相关角色

参与这个模式的角色有以下几种:

  • AbstractFactory: 抽象工厂,主要用于声明一个创建product的接口,这在javascript中一般不会使用。
  • ConcreteFactory:具象工厂,制造product的工厂对象,它的create方法返回一个product对象,示例代码中EmployeeFactoryVendorFactory就是具象工厂。
  • Products:产品对象,被factory创建的产品对象,在示例代码中EmployeeVendor就是产品对象。
  • AbstractProduct:抽象产品,用来声明要创建产品的接口,在javascript中不会被使用。

举例

在下面的例子中,有两个具象工程,EmployeeFactoryVendorFactory,第一个创建Employee实例,第二个创建Vendor实例。创建一个包含两个employee和两个Vendor的数组,并让他们说出自己的角色和名称。

function Employee(name) {
    this.name = name;

    this.say = function () {
        console.log("I am employee " + name);
    };
}

function EmployeeFactory() {

    this.create = function (name) {
        return new Employee(name);
    };
}

function Vendor(name) {
    this.name = name;

    this.say = function () {
        console.log("I am vendor " + name);
    };
}

function VendorFactory() {

    this.create = function (name) {
        return new Vendor(name);
    };
}

function run() {
    var persons = [];
    var employeeFactory = new EmployeeFactory();
    var vendorFactory = new VendorFactory();

    persons.push(employeeFactory.create("Joan DiSilva"));
    persons.push(employeeFactory.create("Tim O'Neill"));
    persons.push(vendorFactory.create("Gerald Watson"));
    persons.push(vendorFactory.create("Nicole McNight"));

    for (var i = 0, len = persons.length; i < len; i++) {
        persons[i].say();
    }
}