国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 靖边县| 雷山县| 伊宁市| 扎鲁特旗| 呼和浩特市| 常山县| 荔浦县| 介休市| 陵川县| 隆子县| 清镇市| 西峡县| 溧阳市| 华池县| 天等县| 贵州省| 屏东县| 天门市| 峨山| 寿宁县| 青海省| 西青区| 社旗县| 南漳县| 宜川县| 枣强县| 建湖县| 连城县| 和龙市| 桓台县| 额济纳旗| 东丰县| 车险| 清水河县| 静安区| 叙永县| 静海县| 彰化县| 肇东市| 南靖县| 滕州市|