Javascript Patterns--读书笔记8 (Factory)
factory模式的目的是用來創(chuàng)建objects.它經(jīng)常以類或者是一個(gè)類的靜態(tài)方法的形式出現(xiàn),但是不論以何種形式的出現(xiàn), 最終都得實(shí)現(xiàn)下面的目標(biāo):
- 當(dāng)我們?cè)谠O(shè)置一組對(duì)象的時(shí)候,它們需要執(zhí)行一組相同的代碼的時(shí)候。
- 在編譯的時(shí)候,在不需要知道確切的類型(class)的時(shí)候,可以創(chuàng)建相應(yīng)的對(duì)象
在傳統(tǒng)面向?qū)ο笳Z言中,第2點(diǎn)尤為重要,當(dāng)我們需要?jiǎng)?chuàng)建類的實(shí)例時(shí),我們往往不能提前知道確切的實(shí)例類型,而在JS中我們可以很輕松的來實(shí)現(xiàn)。
以factory method或者是facotry class來創(chuàng)建對(duì)象的時(shí)候,都是通過繼承相同的parent object, 然后利用不同的subclasses來創(chuàng)建不同的對(duì)象。
來讓我們看一個(gè)實(shí)例:
- 一個(gè)共同的父類CarMaker
- 一個(gè)靜態(tài)方法factory(),它被用來創(chuàng)建car objects
- 一系列construcors, CarMaker.Compact, CarMaker.SUV, CarMaker.Convertible它們都繼承自CarMkaer. 它們?nèi)勘欢x成CarMaker的靜態(tài)屬性
先看一下,如何來應(yīng)用我們所創(chuàng)建的這一組工廠方法:
View Code 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');這是最常見的一種工廠模式的應(yīng)用。我們來觀察一下代碼可以發(fā)現(xiàn),我們傳遞給這個(gè)工廠方法一個(gè)字符串,用來指示我們希望得到的對(duì)象的類型,在運(yùn)行的時(shí)候,我們就可以得到相應(yīng)的對(duì)象。這里并沒有應(yīng)用到new constructor()或者是object literals這種方式來產(chǎn)生一個(gè)新對(duì)象,而僅僅是用一個(gè)方法用接收到的字符串所表示的類型就可以做到。下面的代碼實(shí)現(xiàn)了上述代碼所應(yīng)用的工廠方法:
View Code //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 existif( typeof CarMaker[constr] !== "function" ){throw {name: "Error",message: constr + " doesn't exist"}}//下面的代碼只繼承一次父對(duì)象//CarMaker.Compact === CarMaker['Compact']訪問對(duì)象屬性的兩種不同方式if (typeof CarMaker[constr].protoype.drive !== 'function'){CarMaker[constr].protoype = new CarMaker();//實(shí)現(xiàn)繼承 }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; };上述的代碼很簡(jiǎn)單,我們只需要根據(jù)傳入factory方法的特定類型來尋找特定的構(gòu)造函數(shù),然后用來生成我們相對(duì)應(yīng)的對(duì)象。繼承的方法driver只是來演示當(dāng)我們對(duì)一組對(duì)象需要實(shí)現(xiàn)相同的code的時(shí)候,我們可以用工廠方法來替代,我們寫每一個(gè)構(gòu)造函數(shù)來創(chuàng)建一個(gè)新對(duì)象。
轉(zhuǎn)載于:https://www.cnblogs.com/moonreplace/archive/2012/10/08/2715378.html
總結(jié)
以上是生活随笔為你收集整理的Javascript Patterns--读书笔记8 (Factory)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ipython和jupyter_IPyt
- 下一篇: 文本标点符号在前面怎么改_这三个标点符号