單純使用new會導致兩個類之間的依賴性,當有多個類構造時,使用一個方法來實例化哪個具體的類,如下面的Fruit水果商店類,通過一個簡單的switch層來判斷。
var FruitShop = function(){}; FruitShop.PRototype = { showFruit: function(model){ var fruit; switch(model){ case 'Apple': fruit = new Apple(); break; case 'Banana': fruit = new Banana(); break; default: fruit = new Pear(); } Interface.check(fruit, FruitShop); //實現了FruitShop接口 fruit.wash(); fruit.sell(); return fruit; } }各種水果之間可以互換使用,因為它們實現了接口FruitShop,因此擁有了水果的wash和sell方法,有關Interface類和check函數可以參考另一篇js中的接口,如果不實現相同接口,工廠模式所謂的批量生產類似對象的作用就失效了。 如果想增加一類水果怎么辦,還要修改Fruit類,然而Fruit類的功能并沒有修改,這樣的話我們考慮把創建新實例的邏輯再分離出來,以后想增加水果修改FruitFactory類就可以
var FruitFactory = { createFruit: function(model){ var fruit; switch(...) return fruit; } } var FruitShop = function(){}; FruitShop.prototype = { showFruit: function(model){ var fruit = FruitFactory.createFruit(model); fruit.wash(); fruit.sell(); return fruit; } }現在我們想讓每種水果決定從哪一類公司進貨
var FruitShop = function(){}' FruitShop.prototype = { showFruit: function(model){ var fruit = this.createFruit(model); fruit.wash(); fruit.sell(); return fruit; }, createFruit: function(model){ throw new Error('Unsupported Operation on a abstract class'); } }Fruit現在是一個抽象類,它不能被實例化,設計一個特定的水果類需要擴展Fruit,重定義其中的createFruit方法。關于extend方法可以參考我另一篇js中的extend方法
var Ashop = function(){}; extend(Ashop, FruitShop); Ashop.prototype.createFruit = function(model){ var fruit; switch(model){ case 'Apple': fruit = new Apple(); break; case 'Banana': fruit = new Banana(); break; default: fruit = new Pear(); } Interface.check(fruit, Fruit); //實現了Fruit接口 fruit.wash(); fruit.sell(); return fruit; } var Bshop = function(){}; extend(Bshop, FruitShop); Bshop.prototype.createFruit = function(model){ ... }這些工廠方法生成的對象都實現了FruitShop接口,所以在其他代碼眼中可以互換,現在的水果可以是Ashop或者Bshop中進貨的:
var shop1 = new Ashop(); var apple = shop1.showFruit('Apple'); var shop2 = new Bshop(); var apple = shop2.showFruit('Apple');我們可以對每個子類進行修改,以支持相關廠家的不同水果,這是工廠模式最重要的特點。對fruit一般性的操作邏輯放在父類fruitShop中,而具體的fruit對象實例化則留在子類中,一般性的代碼集中在父類,而有變化的代碼封裝在子類中。
如果需要像水果一樣,有多種需要實現同一接口的對象,這時我們就需要使用工廠模式對new對象的過程進行一些邏輯分析和封裝
新聞熱點
疑難解答