《Javascript设计模式》读书笔记之“工厂模式”

对象或类内部往往会包含别的对象,在创建成员对象时你可能习惯于使用使用传统的new来创建对象。但是这种方式会造成两个对象之间的依赖。

工厂模式就是一种有助于消除或减弱这种依赖的设计模式。

书中用自行车商店的例子阐述了简单工厂模式。先是用传统的方式,在 BicycleShop 类内部用new来创建各种自行车。然后说了这种方式的弊端,当情况发生变化时,如要填一个自行车种类,这时候就需要修改 BicycleShop 的代码,哪怕是这个类实际功能没有发生改变。更好的方法是把创建各种自行车的部分转交给一个简单工厂对象—— BicycleFactory ,在 BicycleFactory 内new各种自行车,BicycleShop 通过 BicycleFactory 获得自行车对象,然后进行组装、清洗等操作。用于有关自行车创建的的信息都集中在 BicycleFactory 内管理,所以修改起来也很方便。BicycleFactory 就是一个简单工厂对象,这种模式把成员对象的创建交给一个外部工厂对象。

真正的工厂模式与简单工厂模式的区别在于,它不是使用一个对象或类来创建自行车,而是使用一个子类。按照正式定义,工厂是一个将其成员对象的实例化推迟到子类中进行的类。

例子还是自行车商店,这次自行车商店从超市变成了专卖店。BicycleShop 设计成了抽象类,各品牌商店为 BicycleShop 的子类。代码如下

var BicycleShop = function () {}; 
BicycleShop.prototype = { 
	sellBicycle: function (model) { 
		var bicycle = this.createBicycle(model); 
		bicycle.assemble(); 
		bicycle.wash(); 
		return bicycle; 
	}, 
	createBicycle: function (model) {
		throw new Error("Unsupported operation on an abstract class."); 
	} 
} 
/*AcmeBicycleShop class*/ 
var AcmeBicycleShop = function () {}; 
extend(AcmeBicycleShop, BicycleShop); 
AcmeBicycleShop.prototype.createBicycle = function (model) { 
	var bicycle; 
	switch(model) { 
		case "The SpeedSter": 
		bicycle = new AcmeSpeedster(); 
		break; 
		case "The Lowrider": 
		bicycle = new AcemLowrider(); 
		break; 
	} 
	Interface.ensureImplements(bicycle, Bicycle); 
	return bicycle; 
}

这样设计的好处是,增加对其他厂家的支持很简单。只要在创建一个 BicycleShop 的子类即可,我们也可以对各个子类进行修改。这是工厂模式最重要的特点,对Bicycle 进行一般性操作的代码可以全部写在父类 BicycleShop 中,而对具体的Bicycle对象实例化的工作推迟到了各个子类中。

工厂模式适用场景

  1、动态实现。创建一些用不同方式实现了同一借口的对象。

  2、节省设置开销。如果对象需要进行复杂且彼此相关的设置,那么使用工厂模式可以减少每种对象的代码量。如果这种设置只需要为特定类型的所有实例执行一次即可,这种作用尤其突出。把这种设置代码放在构造函数中并不是一种高效的做法,这是因为即使设置工作已经完成,每次创建新实例的时候这些代码还是会执行,而且这样会把设置代码分散到不同的类中。工厂方法非常适合这种场合。它可以在实例化所有对象之前先一次性地进行设置。无论多少不同的类会被实例化,这种方法都可以让设置代码集中到一个地方。

  3、用许多小型对象组装成一个大对象。

原文地址:https://www.cnblogs.com/chaos-forfun/p/3237797.html