继续记录一些javascript设计模式,后续有时间再完善一遍,形成一个整体。
工厂模式
一个抽象工厂创建的是与一些公共主题相关的对象,在面向对象编程中,Factory
是创建其它对象的对象,抽象工厂创建了一个公共主题,这个主题被它所创建的对象共享。
你可能会迷惑为什么把创建对象的过程留给Factory
而不是直接new
一下构造函数,原因是new
构造函数对创建过程的控制是有限的,有时候需要将对象创建的控制权交给有更加广泛能力的Factory
。
这里的能力可能包括以下场景:创建过程涉及到对象缓存、对象共享或者重用,其它复杂逻辑以及不同设备交互的对象。如果应用程序需要更多的控制对象创建过程,可以考虑使用Factory
。
图解
相关角色
参与这个模式的角色有以下几种:
- AbstractFactory: 抽象工厂,主要用于声明一个创建
product
的接口,这在javascript中一般不会使用。 - ConcreteFactory:具象工厂,制造
product
的工厂对象,它的create方法返回一个product
对象,示例代码中EmployeeFactory
和VendorFactory
就是具象工厂。 - Products:产品对象,被
factory
创建的产品对象,在示例代码中Employee
和Vendor
就是产品对象。 - AbstractProduct:抽象产品,用来声明要创建产品的接口,在javascript中不会被使用。
举例
在下面的例子中,有两个具象工程,EmployeeFactory
和VendorFactory
,第一个创建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();
}
}