zoukankan      html  css  js  c++  java
  • 《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、用许多小型对象组装成一个大对象。

  • 相关阅读:
    阅读笔记09
    阅读笔记08
    阅读笔记07
    阅读笔记06
    阅读笔记05
    有关eclipse连接SQL Server 2008的问题
    每周进度条05
    软件需求模式阅读笔记04
    每周进度条04
    软件需求模式阅读笔记03
  • 原文地址:https://www.cnblogs.com/chaos-forfun/p/3237797.html
Copyright © 2011-2022 走看看