Javascript Patterns--读书笔记8 (Factory)
factory模式的目的是用来创建objects.它经常以类或者是一个类的静态方法的形式出现,但是不论以何种形式的出现, 最终都得实现下面的目标:
- 当我们在设置一组对象的时候,它们需要执行一组相同的代码的时候。
- 在编译的时候,在不需要知道确切的类型(class)的时候,可以创建相应的对象
在传统面向对象语言中,第2点尤为重要,当我们需要创建类的实例时,我们往往不能提前知道确切的实例类型,而在JS中我们可以很轻松的来实现。
以factory method或者是facotry class来创建对象的时候,都是通过继承相同的parent object, 然后利用不同的subclasses来创建不同的对象。
来让我们看一个实例:
- 一个共同的父类CarMaker
- 一个静态方法factory(),它被用来创建car objects
- 一系列construcors, CarMaker.Compact, CarMaker.SUV, CarMaker.Convertible它们都继承自CarMkaer. 它们全部被定义成CarMaker的静态属性
先看一下,如何来应用我们所创建的这一组工厂方法:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
var corolla = CarMaker.factory('Compact'); var solstice = CarMaker.factory('Convertible'); var cherokee = CarMaker.factory('SUV'); conrolla.drive();//"Vroom, I have 4 doors" solstice.drive();//"Vroom, I have 2 doors" cherokee.drive();//Vroom, I have 17 doors
让我们来分析一下代码:
var corolla = CarMaker.factory('Compact');
这是最常见的一种工厂模式的应用。我们来观察一下代码可以发现,我们传递给这个工厂方法一个字符串,用来指示我们希望得到的对象的类型,在运行的时候,我们就可以得到相应的对象。这里并没有应用到new constructor()或者是object literals这种方式来产生一个新对象,而仅仅是用一个方法用接收到的字符串所表示的类型就可以做到。下面的代码实现了上述代码所应用的工厂方法:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//parent constrructor function CarMaker() {} //a method of the parent CarMaker.prototype.drive = function() { return "Vroom, I have "+ this.doors +" doors"; } //the static factory mehtod CarMaker.factory = function( type ) { var constr = type, newcar; //error if the constructor doesn't exist if( typeof CarMaker[constr] !== "function" ){ throw { name: "Error", message: constr + " doesn't exist" } } //下面的代码只继承一次父对象 //CarMaker.Compact === CarMaker['Compact']访问对象属性的两种不同方式 if (typeof CarMaker[constr].protoype.drive !== 'function'){ CarMaker[constr].protoype = new CarMaker();//实现继承 } newcar = new CarMaker[constr](); return newcar; } //定义我们所需要的car CarMaker.Compact = function() { this.doors = 4; }; CarMaker.Convertible = function() { this.doors = 2; }; CarMaker.SUV = function () { this.doors = 17; };
上述的代码很简单,我们只需要根据传入factory方法的特定类型来寻找特定的构造函数,然后用来生成我们相对应的对象。继承的方法driver只是来演示当我们对一组对象需要实现相同的code的时候,我们可以用工厂方法来替代,我们写每一个构造函数来创建一个新对象。