摘要:工廠設(shè)計模式工廠設(shè)計模式顧名思義就是生產(chǎn)對象的工廠在這里需要注意的是生產(chǎn)的對象都是同一規(guī)格的具有某些相同的特性否則工廠模式的意義蕩然無存接口在工廠模式中有著重要的作用如果對生產(chǎn)的對象不實現(xiàn)某個接口試問我們?yōu)槭裁催€要工廠模式工廠模式使得我們創(chuàng)
工廠設(shè)計模式
工廠設(shè)計模式, 顧名思義就是生產(chǎn)對象的工廠, 在這里需要注意的是生產(chǎn)的對象都是同一規(guī)格的, 具有某些相同的特性, 否則工廠模式的意義蕩然無存簡單工廠
接口在工廠模式中有著重要的作用, 如果對生產(chǎn)的對象不實現(xiàn)某個接口, 試問我們?yōu)槭裁催€要工廠模式, 工廠模式使得我們創(chuàng)建的所有事例可以一視同仁, 屏蔽了不同對象的區(qū)別, 因為他們實現(xiàn)的同樣的接口
簡單工廠就是工廠所生產(chǎn)的產(chǎn)品雖然都符合接口規(guī)范, 但產(chǎn)品無法分類, 這里簡單舉一個商店出售自行車的例子, 則所生產(chǎn)的自行車都實現(xiàn)了自行車的規(guī)范, 但自行車無法分辨廠家
let BicycleShop = (function () { /* BicycleFactory namespace. */ let BicycleFactory = { createBicycle: function(model) { let bicycle; switch(model) { case "The Speedster": bicycle = new Speedster(); break; case "The Lowrider": bicycle = new Lowrider(); break; case "The Comfort Cruiser": default: bicycle = new ComfortCruiser(); } Interface.ensureImplements(bicycle, Bicycle); return bicycle; } }; /* BicycleShop class, improved. */ let BicycleShop = function() {}; BicycleShop.prototype = { sellBicycle: function(model) { var bicycle = BicycleFactory.createBicycle(model); bicycle.assemble(); bicycle.wash(); return bicycle; } }; return BicycleShop; })();
/* The Bicycle interface. */ var Bicycle = new Interface("Bicycle", ["assemble", "wash", "ride", "repair"]); /* Speedster class. */ var Speedster = function() { // implements Bicycle ... }; Speedster.prototype = { assemble: function() { ... }, wash: function() { ... }, ride: function() { ... }, repair: function() { ... } }; /* Usage. */ var californiaCruisers = new BicycleShop(); var yourNewBike = californiaCruisers.sellBicycle("The Speedster");
簡單工廠的弊端在于所有的對象都有工廠類來實現(xiàn), 無法對對象分類, 降低了拓展性, 比如如果有膜拜自行車專賣店和ofo自行車專賣店呢, 所以簡單的業(yè)務(wù)簡單工廠就夠了, 如果面對復(fù)雜業(yè)務(wù)邏輯則需要抽象工廠模式抽象工廠
真正的工廠模式與簡單工廠區(qū)別在于, 它不是使用工廠類來生產(chǎn)對象的, 而是使用其子類, 將其成員對象的實例化推遲到子類中, 這樣就可以對自行車進(jìn)行分類, 例如工廠類為接口或抽象類, 膜拜自行車工廠和ofo自行車工廠為子類, 當(dāng)然這兩家的自行車都實現(xiàn)了自行車接口, 下面如圖所示;
首先定義一個工廠類
var BicycleShop = (function() { let BicycleShop = function() {}; BicycleShop.prototype = { sellBicycle: function(model) { var bicycle = this.createBicycle(model); return bicycle; }, createBicycle: function(model) { throw new Error("Unsupported operation on an abstract class."); } }; return BicycleShop })();
然后定義多個繼承工廠類的基于分類的類
let AcmeBicycleShop = (function() { /* AcmeBicycleShop class. */ let AcmeBicycleShop = function() {}; extend(AcmeBicycleShop, BicycleShop); AcmeBicycleShop.prototype.createBicycle = function(model) { let bicycle; switch(model) { case "The Speedster": bicycle = new AcmeSpeedster(); break; case "The Lowrider": bicycle = new AcmeLowrider(); break; case "The Flatlander": bicycle = new AcmeFlatlander(); break; case "The Comfort Cruiser": default: bicycle = new AcmeComfortCruiser(); } Interface.ensureImplements(bicycle, Bicycle); return bicycle; }; return AcmeBicycleShop })(); var GeneralProductsBicycleShop = (function() { /* GeneralProductsBicycleShop class. */ let GeneralProductsBicycleShop = function() {}; extend(GeneralProductsBicycleShop, BicycleShop); GeneralProductsBicycleShop.prototype.createBicycle = function(model) { let bicycle; switch(model) { case "The Speedster": bicycle = new GeneralProductsSpeedster(); break; case "The Lowrider": bicycle = new GeneralProductsLowrider(); break; case "The Flatlander": bicycle = new GeneralProductsFlatlander(); break; case "The Comfort Cruiser": default: bicycle = new GeneralProductsComfortCruiser(); } Interface.ensureImplements(bicycle, Bicycle); return bicycle; }; })();
最后使用
/* Usage. */ var alecsCruisers = new AcmeBicycleShop(); var yourNewBike = alecsCruisers.sellBicycle("The Lowrider"); var bobsCruisers = new GeneralProductsBicycleShop(); var yourSecondNewBike = bobsCruisers.sellBicycle("The Lowrider");
抽象工廠模式可以把公共代碼放在父類中, 個體性的代碼放在子類中, 責(zé)任分離的同時提高拓展性
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/107360.html
摘要:抽象工廠模式可以向客戶端提供一個接口,使客戶端在不必指定產(chǎn)品的具體的情況下,創(chuàng)建多個產(chǎn)品族中的產(chǎn)品對象。前邊的兩個都是直接生產(chǎn)實例的,開始以為抽象工廠也是但是后來發(fā)現(xiàn)抽象工廠更像是生產(chǎn)工廠,其實抽象工廠其實是實現(xiàn)子類繼承父類的方法。 創(chuàng)建型模式 創(chuàng)建型模式是對一個類的實例化過程進(jìn)行了抽象,把對象的創(chuàng)建和對象的使用進(jìn)行了分離 上一篇介紹了下單例模式,這一篇介紹一下工廠模式和抽象工廠模式,...
摘要:參考文章深入理解三種工廠模式工廠模式,工廠方法模式,抽象工廠模式詳解工廠模式是中最常用的設(shè)計模式之一。這種類型的設(shè)計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。 參考文章:深入理解java三種工廠模式工廠模式,工廠方法模式,抽象工廠模式 詳解 工廠模式(Factory Pattern)是 Java 中最常用的設(shè)計模式之一。這種類型的設(shè)計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的...
摘要:抽象工廠模式抽象工廠是工廠模式的升級版,他用來創(chuàng)建一組相關(guān)或者相互依賴的對象。代碼抽象工廠模式抽象工廠的優(yōu)點抽象工廠模式除了具有工廠方法模式的優(yōu)點外,最主要的優(yōu)點就是可以在類的內(nèi)部對產(chǎn)品族進(jìn)行約束。 抽象工廠模式 抽象工廠是工廠模式的升級版,他用來創(chuàng)建一組相關(guān)或者相互依賴的對象。上節(jié)學(xué)習(xí)了工廠模式,類的創(chuàng)建依賴工廠類,程序需要擴(kuò)展時,我們必須創(chuàng)建新的工廠類。工廠類是用來生產(chǎn)產(chǎn)品的,那我...
摘要:簡介抽象工廠模式就是通過類的抽象使得業(yè)務(wù)適用于一個產(chǎn)品類簇的創(chuàng)建,而不負(fù)責(zé)某一類產(chǎn)品的實例。通過抽象工廠,就可以創(chuàng)建某個類簇的產(chǎn)品,并且也可以通過來檢查產(chǎn)品的類別,也具備該類簇所必備的方法。 0. 簡介 抽象工廠模式(Abstract Factory)就是通過類的抽象使得業(yè)務(wù)適用于一個產(chǎn)品類簇的創(chuàng)建,而不負(fù)責(zé)某一類產(chǎn)品的實例。 JS中是沒有直接的抽象類的,abstract是個保留字,但...
摘要:簡單工廠模式簡單工廠模式又叫靜態(tài)工廠模式,由一個工廠對象決定創(chuàng)建某一種產(chǎn)品對象類的實例。工廠方法模式工廠方法模式的本意是將實際創(chuàng)建對象的工作推遲到子類中,這樣核心類就變成了抽象類。抽象工廠模式一般用在 1 什么是工廠模式? 工廠模式是用來創(chuàng)建對象的一種最常用的設(shè)計模式。我們不暴露創(chuàng)建對象的具體邏輯,而是將將邏輯封裝在一個函數(shù)中,那么這個函數(shù)就可以被視為一個工廠。工廠模式根據(jù)抽象程度的不...
摘要:簡單工廠模式簡單工廠模式又叫靜態(tài)工廠模式,由一個工廠對象決定創(chuàng)建某一種產(chǎn)品對象類的實例。工廠方法模式工廠方法模式的本意是將實際創(chuàng)建對象的工作推遲到子類中,這樣核心類就變成了抽象類。抽象工廠模式一般用在 1 什么是工廠模式? 工廠模式是用來創(chuàng)建對象的一種最常用的設(shè)計模式。我們不暴露創(chuàng)建對象的具體邏輯,而是將將邏輯封裝在一個函數(shù)中,那么這個函數(shù)就可以被視為一個工廠。工廠模式根據(jù)抽象程度的不...
閱讀 1610·2021-11-02 14:48
閱讀 3665·2019-08-30 15:56
閱讀 2778·2019-08-30 15:53
閱讀 3220·2019-08-30 14:09
閱讀 3115·2019-08-30 12:59
閱讀 2867·2019-08-29 18:38
閱讀 2707·2019-08-26 11:41
閱讀 2224·2019-08-23 16:45