简单工厂模式是由一个方法来决定到底要创建哪个类的实例, 而这些实例经常都拥有相同的接口. 这种模式主要用在所实例化的类型在编译期并不能确定, 而是在执行期决定的情况。 说的通俗点,就像公司茶水间的饮料机,要咖啡还是牛奶取决于你按哪个按钮。
e.g.
var BicycleShop = function(){};
BicycleShop.prototype = {
sellBicycle : function( model ){
var bicycle;
switch( model ){
case "The Speedster":
bicycle = new Speedster();
break;
case "The Lowrider":
bicycle = new Lowrider();
break;
case "The Cruiser":
default:
bicycle = new Cruiser();
break;
}
return bicycle;
}
}
sellBicycle 方法根据所提供的自行车型号来进行自行车的实例创建。那么对于一家ABC店铺,需要Speedster车型我只需要
var ABC = new BicycleShop();
var myBike = ABC.sellBicycle("The Speedster");
以上方式很管用,但是一旦说我需要添加一些自行车款式的时候我就必须修改 BicycleShop 的 switch 部分,那么只要是修改就有可能带来BUG。所以,将这部分生成实例的代码单独的提出来分工交给一个简单的工厂对象是一个很不错的方法。
var BicycleFactory = { createBicycle : function( model ){ var bicycle; switch( model ){ case "The Speedster": bicycle = new Speedster(); break; case "The Lowrider": bicycle = new Lowrider(); break; case "The Cruiser": default: bicycle = new Cruiser(); break; } return bycicle; } }
BicycleFactory 是一个脱离于BicycleShop的单体。降低耦合度的效果显而易见。当需要添加新的类型的时候,不需要动 BicycleShop 只需修改工厂单体对象就可以。
var BicycleShop = function(){}; BicycleShop.prototype = { sellBicycle : function( model ){ var bicycle = BicycleFactory.createBicycle(model); return bicycle; } }
工厂模式定义一个用于创建对象的接口,这个接口由子类决定实例化哪一个类。该模式使一个类的实例化延迟到了子类。而子类可以重写接口方法以便创建的时候指定自己的对象类型。
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");
什么时候使用工厂模式
以下几种情景下工厂模式特别有用:
- 对象的构建十分复杂
- 需要依赖具体环境创建不同实例
- 处理大量具有相同属性的小对象
以上就是一个很好的 简单工厂模式 的实例。该模式将成员对象的创建工作交给一个外部对象实现,该外部对象可以是一个简单的命名空间,也可以是一个类的实例。
工厂模式之利
主要好处就是可以消除对象间的耦合,通过使用工程方法而不是new关键字。将所有实例化的代码集中在一个位子防止代码重复。
工厂模式之弊
大多数类最好使用new关键字和构造函数,可以让代码更加简单易读。而不必去查看工厂方法来知道。
转自:http://blog.chinaunix.net/uid-26672038-id-4011524.html
http://www.cnblogs.com/TomXu/archive/2012/02/23/2353389.html