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

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

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

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

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

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

 

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对象实例化的工做推迟到了各个子类中。设计

工厂模式适用场景对象

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

  二、节省设置开销。若是对象须要进行复杂且彼此相关的设置,那么使用工厂模式能够减小每种对象的代码量。若是这种设置只须要为特定类型的全部实例执行一次便可,这种做用尤为突出。把这种设置代码放在构造函数中并非一种高效的作法,这是由于即便设置工做已经完成,每次建立新实例的时候这些代码仍是会执行,并且这样会把设置代码分散到不一样的类中。工厂方法很是适合这种场合。它能够在实例化全部对象以前先一次性地进行设置。不管多少不一样的类会被实例化,这种方法均可以让设置代码集中到一个地方。io

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

相关文章
相关标签/搜索