與創(chuàng)建型模式類(lèi)似,工廠模式創(chuàng)建對(duì)象(視為工廠里的產(chǎn)品)時(shí)無(wú)需指定創(chuàng)建對(duì)象的具體類(lèi)。
工廠模式定義一個(gè)用于創(chuàng)建對(duì)象的接口,這個(gè)接口由子類(lèi)決定實(shí)例化哪一個(gè)類(lèi)。該模式使一個(gè)類(lèi)的實(shí)例化延遲到了子類(lèi)。而子類(lèi)可以重寫(xiě)接口方法以便創(chuàng)建的時(shí)候指定自己的對(duì)象類(lèi)型。
這個(gè)模式十分有用,尤其是創(chuàng)建對(duì)象的流程賦值的時(shí)候,比如依賴于很多設(shè)置文件等。并且,你會(huì)經(jīng)常在程序里看到工廠方法,用于讓子類(lèi)類(lèi)定義需要?jiǎng)?chuàng)建的對(duì)象類(lèi)型。
下面這個(gè)例子中,是應(yīng)用了工廠方法對(duì)第26章構(gòu)造函數(shù)模式代碼的改進(jìn)版本:
var Car = (function () { var Car = function (model, year, miles) { this.model = model; this.year = year; this.miles = miles; }; return function (model, year, miles) { return new Car(model, year, miles); }; })(); var tom = new Car("Tom", 2009, 20000); var dudu = new Car("Dudu", 2010, 5000);
不好理解的話,我們?cè)俳o一個(gè)例子:
var productManager = {}; productManager.createProductA = function () { console.log('ProductA'); } productManager.createProductB = function () { console.log('ProductB'); } productManager.factory = function (typeType) { return new productManager[typeType]; } productManager.factory("createProductA");
如果還不理解的話,那我們就再詳細(xì)一點(diǎn)咯,假如我們想在網(wǎng)頁(yè)面里插入一些元素,而這些元素類(lèi)型不固定,可能是圖片,也有可能是連接,甚至可能是文本,根據(jù)工廠模式的定義,我們需要定義工廠類(lèi)和相應(yīng)的子類(lèi),我們先來(lái)定義子類(lèi)的具體實(shí)現(xiàn)(也就是子函數(shù)):
var page = page || {}; page.dom = page.dom || {}; //子函數(shù)1:處理文本 page.dom.Text = function () { this.insert = function (where) { var txt = document.createTextNode(this.url); where.appendChild(txt); }; }; //子函數(shù)2:處理鏈接 page.dom.Link = function () { this.insert = function (where) { var link = document.createElement('a'); link.href = this.url; link.appendChild(document.createTextNode(this.url)); where.appendChild(link); }; }; //子函數(shù)3:處理圖片 page.dom.Image = function () { this.insert = function (where) { var im = document.createElement('img'); im.src = this.url; where.appendChild(im); }; };
那么我們?nèi)绾味x工廠處理函數(shù)呢?其實(shí)很簡(jiǎn)單:
page.dom.factory = function (type) { return new page.dom[type]; }
使用方式如下:
var o = page.dom.factory('Link'); o.url = 'http://www.cnblogs.com'; o.insert(document.body);
至此,工廠模式的介紹相信大家都已經(jīng)了然于心了,我就不再多敘述了。
什么時(shí)候使用工廠模式
以下幾種情景下工廠模式特別有用:
什么時(shí)候不該用工廠模式
不濫用運(yùn)用工廠模式,有時(shí)候僅僅只是給代碼增加了不必要的復(fù)雜度,同時(shí)使得測(cè)試難以運(yùn)行下去。
更多建議: