对象或类内部每每会包含别的对象,在建立成员对象时你可能习惯于使用使用传统的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