上節我們講解了單例模式,這節我們將繼續講解工廠模式和迭代器模式
工廠模式:
工廠模式的目的是為了方便的建立物件(可以在不知道構造的情況下),通過靜態方法來實現,在java或c#等靜態編譯語言中需要通過反射實現,而javascript這一切會很簡單,利用索引訪問方法特性,如Coffee[coffeeType]();
var Coffee = function (name,price) { this.name = name; this.price = price; } Coffee.createCoffee = function (coffeeType) { if (typeof Coffee[coffeeType] != 'function') { throw Error('沒有此種型別咖啡'); } return Coffee[coffeeType](); } Coffee.mocha = function () { return new Coffee('MochaCoffee', 20); } Coffee.blue = function () { return new Coffee('BlueCoffee', 30); } module.exports = Coffee;
var blueCoffee = Coffee.createCoffee('blue'); console.log(blueCoffee.name === 'BlueCoffee');
通過靜態方法建立各種型別coffee實現,然後在工廠方法(createCoffee)中通過索引呼叫相應的方法並返回物件,在程式碼編寫過程中最重要的是將方法名和方法的實際含義關聯起來,這樣再建立時才可以正確快速的找到需要的型別。
裝飾模式:
裝飾模式是一種非常實用的模式,本質是一種物件的組合,手機話費構成是典型的裝飾模式,話費一般由基礎套餐(N個)和特色套餐(m個)構成,不做處理的情況下使用者套餐可能需要n*m個物件才能描述,很顯然沒人會這樣做,人們需要的是一個N+M的組合方式。
首先定義基礎套餐類,基礎套餐採用之前介紹的工廠模式建立,預置了幾種套餐型別:
var BasePackage = function (price, description) { this.price = Number(price); this.description = description; BasePackage.prototype.getDescription = function () { return '您的套餐:' + this.description + '每月' + this.price; } } BasePackage.create = function (packageType) { if (typeof BasePackage[packageType] != "function") { throw Error('沒有這樣的套餐'); } return BasePackage[packageType](); } BasePackage.home = function () { return new BasePackage('50', '基礎套餐'); } BasePackage.business = function () { return new BasePackage('100', '商務套餐'); } BasePackage.ultimate = function () { return new BasePackage('150', '旗艦套餐'); }
接著建立特色套餐,同樣採用工廠模式,也同樣預置幾種套餐型別
var FeaturePackage = function (price, description) { this.price = Number(price); this.description = description; } FeaturePackage.create = function (packageType) { if (typeof FeaturePackage[packageType] != "function") { throw Error('沒有這樣的套餐'); } return FeaturePackage[packageType](); } FeaturePackage.traffic = function () { return new FeaturePackage('20', '流量套餐'); } FeaturePackage.sms = function () { return new FeaturePackage('10', '簡訊套餐'); }
需要將特色套餐裝飾到基礎套餐類中從而實現各種套餐組合,在基礎套餐類定義裝飾方法:
BasePackage.prototype.decorate= function(decorate) { var featurePackage = FeaturePackage.create(decorate); this.price += featurePackage.price; this.description += ' + ' + featurePackage.description; }
最後在搭配套餐的時候只需要選擇想要的基礎套餐和特色套餐裝飾起來即可:
var basePackage = BasePackage.create('home'); basePackage.decorate('sms'); console.log(basePackage.getDescription());
小結:
本節講解了工廠和裝飾模式,並將兩種模式融合在一起組成了一個手機套餐例項,工廠模式可以代替new操作,而裝飾模式可以將物件進行組合從而實現程式碼的複用。