工厂方法模式(Factory method pattern)是一种实现“工厂”概念的面上对象设计模式。实质是定义一个创建对象的接口,但是让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。 创建一个对象常常需要复杂的过程,所以不适合在一个复杂的对象中。创建对象可能会导致大量的重复代码,也可能提供不了足够级别的抽象。工厂方法模式通过定义一个单独的创建对象的方法来解决这些问题,由子类实现这个方法来创建具体类型的对象。
工厂模式就是一种有助于消除两个类依赖性的模式。
//例1
var Car = (
function () {
var Car =
function (model, year, miles) {
this.model = model;
this.year = year;
this.miles = miles;
};
return function (model, year, miles) {
return new Car(model, year, miles);
};
})();
var tom =
new Car("Tom", 2009, 20000);
var dudu =
new Car("Dudu", 2010, 5000);
//例2
var productManager = {};
productManager.createProductA =
function () {
console.log('ProductA');
}
productManager.createProductB =
function () {
console.log('ProductB');
}
productManager.factory =
function (typeType) {
return new productManager[typeType];
}
productManager.factory("createProductA");//例3
var page = page || {};
page.dom = page.dom || {};
//子函数1:处理文本
page.dom.Text =
function () {
this.insert =
function (where) {
var txt = document.createTextNode(
this.url);
where.appendChild(txt);
};
};
//子函数2:处理链接
page.dom.Link =
function () {
this.insert =
function (where) {
var link = document.createElement('a');
link.href =
this.url;
link.appendChild(document.createTextNode(
this.url));
where.appendChild(link);
};
};
//子函数3:处理图片
page.dom.Image =
function () {
this.insert =
function (where) {
var im = document.createElement('img');
im.src =
this.url;
where.appendChild(im);
};
};//
那么我们如何定义工厂处理函数呢?其实很简单:page.dom.factory =
function (type) {
return new page.dom[type];
}//
使用方式如下:var o = page.dom.factory('Link');
o.url = 'http://www.cnblogs.com';
o.insert(document.body);
工厂模式使用场合
1. 动态实现
例如自行车的例子,创建一些用不同方式实现统一接口的对象,那么可以使用一个工厂方法或者简单工厂对象来简化实现过程。选择可以是明确进行的也可以是隐含的。
2. 节省设置开销
如果对象要进行复杂的并且彼此相关的设置的时候,那么工厂模式可以很显著的减少每种对象的代码量。将特定的设置代码提取出来会使得代码有极大地提升。并且能优化结构便于维护。
3. 用于许多小型对象组成一个大对象。
4. 工厂模式之利
主要好处就是可以消除对象间的耦合,通过使用工程方法而不是new关键字。将所有实例化的代码集中在一个位子防止代码重复。
5. 工厂模式之弊
大多数类最好使用new关键字和构造函数,可以让代码更加简单易读。而不必去查看工厂方法来知道。