国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網(wǎng)站 > WEB開發(fā) > 正文

javascript工廠模式

2024-04-27 15:04:28
字體:
供稿:網(wǎng)友

簡單工廠

單純使用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); //實現(xiàn)了FruitShop接口 fruit.wash(); fruit.sell(); return fruit; } }

各種水果之間可以互換使用,因為它們實現(xiàn)了接口FruitShop,因此擁有了水果的wash和sell方法,有關Interface類和check函數(shù)可以參考另一篇js中的接口,如果不實現(xiàn)相同接口,工廠模式所謂的批量生產(chǎn)類似對象的作用就失效了。 如果想增加一類水果怎么辦,還要修改Fruit類,然而Fruit類的功能并沒有修改,這樣的話我們考慮把創(chuàng)建新實例的邏輯再分離出來,以后想增加水果修改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; } }

真正的工廠模式

現(xiàn)在我們想讓每種水果決定從哪一類公司進貨

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現(xiàn)在是一個抽象類,它不能被實例化,設計一個特定的水果類需要擴展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); //實現(xiàn)了Fruit接口 fruit.wash(); fruit.sell(); return fruit; } var Bshop = function(){}; extend(Bshop, FruitShop); Bshop.prototype.createFruit = function(model){ ... }

這些工廠方法生成的對象都實現(xiàn)了FruitShop接口,所以在其他代碼眼中可以互換,現(xiàn)在的水果可以是Ashop或者Bshop中進貨的:

var shop1 = new Ashop(); var apple = shop1.showFruit('Apple'); var shop2 = new Bshop(); var apple = shop2.showFruit('Apple');

我們可以對每個子類進行修改,以支持相關廠家的不同水果,這是工廠模式最重要的特點。對fruit一般性的操作邏輯放在父類fruitShop中,而具體的fruit對象實例化則留在子類中,一般性的代碼集中在父類,而有變化的代碼封裝在子類中。

總結

如果需要像水果一樣,有多種需要實現(xiàn)同一接口的對象,這時我們就需要使用工廠模式對new對象的過程進行一些邏輯分析和封裝


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 清流县| 蒲江县| 吉林市| 北川| 武定县| 九寨沟县| 应城市| 轮台县| 巴彦县| 崇礼县| 安仁县| 静海县| 湘乡市| 巴青县| 巢湖市| 庐江县| 扬州市| 武义县| 太仆寺旗| 陈巴尔虎旗| 收藏| 静宁县| 桃江县| 滦南县| 杭州市| 高密市| 连城县| 广南县| 慈溪市| 义乌市| 逊克县| 苏尼特右旗| 宿迁市| 通山县| 盐山县| 郸城县| 静乐县| 清丰县| 辰溪县| 冕宁县| 榆林市|