摘要:抽象工廠模式可以向客戶端提供一個(gè)接口,使客戶端在不必指定產(chǎn)品的具體的情況下,創(chuàng)建多個(gè)產(chǎn)品族中的產(chǎn)品對象。前邊的兩個(gè)都是直接生產(chǎn)實(shí)例的,開始以為抽象工廠也是但是后來發(fā)現(xiàn)抽象工廠更像是生產(chǎn)工廠,其實(shí)抽象工廠其實(shí)是實(shí)現(xiàn)子類繼承父類的方法。
創(chuàng)建型模式
創(chuàng)建型模式是對一個(gè)類的實(shí)例化過程進(jìn)行了抽象,把對象的創(chuàng)建和對象的使用進(jìn)行了分離
上一篇介紹了下單例模式,這一篇介紹一下工廠模式和抽象工廠模式,為什么把這兩個(gè)放在一起說,因?yàn)槲覀€(gè)人認(rèn)為他們兩個(gè)是有關(guān)聯(lián)的,簡單工廠模式被我看作是工廠模式的簡潔版,然后工廠模式被我看作是抽象工廠模式的簡潔版
簡單工廠定義:簡單工廠模式中,可以根據(jù)參數(shù)的不同返回不同類的實(shí)例。簡單工廠模式專門定義一個(gè)類來負(fù)責(zé)創(chuàng)建其他類的實(shí)例,被創(chuàng)建的實(shí)例通常都具有共同的父類。
比如你去專門賣鼠標(biāo)的地方你可以買各種各樣的鼠標(biāo)
最通俗的理解就是封裝,簡單帶過一下
function mouse(color,long){ var o = new Object(); o.color= color; o.long= long; o.Explain= function(){ console.log(this.color,this.long); } return o; } var mouseA = mouse("黑色",3);工廠模式
定義:工廠方法模式中,工廠父類負(fù)責(zé)定義創(chuàng)建產(chǎn)品對象的公共接口,而工廠子類則負(fù)責(zé)生成具體的產(chǎn)品對象,這樣做的目的是將產(chǎn)品類的實(shí)例化操作延遲到工廠子類中完成,即通過工廠子類來確定究竟應(yīng)該實(shí)例化哪一個(gè)具體產(chǎn)品類。
比如去旁邊還有個(gè)專門賣鍵盤的和耳機(jī)的然后他和賣鼠標(biāo)的組成了一個(gè)門店
你要進(jìn)如這個(gè)門店然后買鼠標(biāo)或者鍵盤或者耳機(jī)
你可以把這個(gè)工廠模式理解成是 進(jìn)化版的簡單工廠模式
shop= function(val) { if(typeof this === "object") { //看看有沒有new 沒有new的話new一個(gè) var s = new this[val](); return s; } else { return new shop(val); } } shop.prototype = { mouse: function() { console.log("買了個(gè)鼠標(biāo)") }, keyboard: function() { console.log("買了個(gè)鍵盤") }, headset: function() { console.log("買了個(gè)耳機(jī)") } } bigShop = new shop(); mouse = new bigshop.mouse();抽象工廠模式
定義:抽象工廠模式是指當(dāng)有多個(gè)抽象角色時(shí),使用的一種工廠模式。抽象工廠模式可以向客戶端提供一個(gè)接口,使客戶端在不必指定產(chǎn)品的具體的情況下,創(chuàng)建多個(gè)產(chǎn)品族中的產(chǎn)品對象。
前邊的兩個(gè)都是直接生產(chǎn)實(shí)例的,開始以為抽象工廠也是但是后來發(fā)現(xiàn)抽象工廠更像是生產(chǎn)工廠,其實(shí)抽象工廠其實(shí)是實(shí)現(xiàn)子類繼承父類的方法。
說白了 抽象工廠模式 我認(rèn)為就是工廠功能模式的擴(kuò)充版,簡單工廠生產(chǎn)實(shí)例 ,工廠功能模式生產(chǎn)實(shí)例的接口,抽象工廠呢生產(chǎn)的是工廠
比如說上邊他們有了個(gè)電腦店的門店 現(xiàn)在電腦店火了 又開了一個(gè)電腦店 然后這兩個(gè)電腦店一個(gè)是聯(lián)想的 一個(gè)是戴爾的
核心代碼 let agency = function(subType, superType) { //判斷抽象工廠中是否有該抽象類 if(typeof agency[superType] === "function") { function F() {}; //繼承父類屬性和方法 F.prototype = new agency[superType] (); //將子類的constructor指向子類 subType.constructor = subType; //子類原型繼承父類 subType.prototype = new F(); } else { throw new Error("抽象類不存在!") } }
這是創(chuàng)建工廠的類 好比專賣店 //鼠標(biāo)抽象類 agency.mouseShop = function() { this.type = "鼠標(biāo)"; } agency.mouseShop.prototype = { getName: function() { return new Error("抽象方法不能調(diào)用"); } } //鍵盤抽象類 agency.KeyboardShop = function() { this.type = "鍵盤"; } agency.KeyboardShop.prototype = { getName: function() { return new Error("抽象方法不能調(diào)用"); } }
//普通鼠標(biāo)子類 function mouse(name) { this.name = name; this.item = ["買我,我線長","玩游戲賊溜"] } //抽象工廠實(shí)現(xiàn)鼠標(biāo)類的繼承 agency(mouse, "mouseShop"); //子類中重寫抽象方法 mouse.prototype.getName = function() { return this.name; } //普通鍵盤子類 function Keyboard(name) { this.name = name; this.item = ["行,你買它吧","沒鍵盤看你咋玩"] } //抽象工廠實(shí)現(xiàn)鍵盤類的繼承 agency(Keyboard, "KeyboardShop"); //子類中重寫抽象方法 Keyboard.prototype.getName = function() { return this.name; }
最后放一下全部代碼
let agency = function(subType, superType) { //判斷抽象工廠中是否有該抽象類 if(typeof agency[superType] === "function") { function F() {}; //繼承父類屬性和方法 F.prototype = new agency[superType] (); //將子類的constructor指向子類 subType.constructor = subType; //子類原型繼承父類 subType.prototype = new F(); } else { throw new Error("抽象類不存在!") } } //鼠標(biāo)抽象類 agency.mouseShop = function() { this.type = "鼠標(biāo)"; } agency.mouseShop.prototype = { getName: function() { return new Error("抽象方法不能調(diào)用"); } } //鍵盤抽象類 agency.KeyboardShop = function() { this.type = "鍵盤"; } agency.KeyboardShop.prototype = { getName: function() { return new Error("抽象方法不能調(diào)用"); } } //普通鼠標(biāo)子類 function mouse(name) { this.name = name; this.item = ["買我,我線長","玩游戲賊溜"] } //抽象工廠實(shí)現(xiàn)鼠標(biāo)類的繼承 agency(mouse, "mouseShop"); //子類中重寫抽象方法 mouse.prototype.getName = function() { return this.name; } //普通鍵盤子類 function Keyboard(name) { this.name = name; this.item = ["行,你買它吧","沒鍵盤看你咋玩"] } //抽象工廠實(shí)現(xiàn)鍵盤類的繼承 agency(Keyboard, "KeyboardShop"); //子類中重寫抽象方法 Keyboard.prototype.getName = function() { return this.name; } //實(shí)例化鼠標(biāo) let mouseA = new mouse("聯(lián)想"); console.log(mouseA.getName(), mouseA.type); //聯(lián)想 鼠標(biāo) let mouseB = new mouse("戴爾"); console.log(mouseB.getName(), mouseB.type); //戴爾 鼠標(biāo) //實(shí)例化鍵盤 let KeyboardA = new Keyboard("聯(lián)想"); console.log(KeyboardA.getName(), KeyboardA.type); //聯(lián)想 鍵盤 let KeyboardB = new Keyboard("戴爾"); console.log(KeyboardB.getName(), KeyboardB.type); //戴爾 鍵盤
我覺得這個(gè)抽象工廠的話 相對前兩種而言 組合比較靈活
抽象工廠不直接創(chuàng)建實(shí)例,個(gè)人認(rèn)為在大型項(xiàng)目的話應(yīng)該蠻實(shí)用的。
以上是個(gè)人的見解,接觸不多,有說的不對或不足之處,請批評指正。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/105562.html
摘要:簡單工廠模式簡單工廠模式又叫靜態(tài)工廠模式,由一個(gè)工廠對象決定創(chuàng)建某一種產(chǎn)品對象類的實(shí)例。工廠方法模式工廠方法模式的本意是將實(shí)際創(chuàng)建對象的工作推遲到子類中,這樣核心類就變成了抽象類。抽象工廠模式一般用在 1 什么是工廠模式? 工廠模式是用來創(chuàng)建對象的一種最常用的設(shè)計(jì)模式。我們不暴露創(chuàng)建對象的具體邏輯,而是將將邏輯封裝在一個(gè)函數(shù)中,那么這個(gè)函數(shù)就可以被視為一個(gè)工廠。工廠模式根據(jù)抽象程度的不...
摘要:簡單工廠模式簡單工廠模式又叫靜態(tài)工廠模式,由一個(gè)工廠對象決定創(chuàng)建某一種產(chǎn)品對象類的實(shí)例。工廠方法模式工廠方法模式的本意是將實(shí)際創(chuàng)建對象的工作推遲到子類中,這樣核心類就變成了抽象類。抽象工廠模式一般用在 1 什么是工廠模式? 工廠模式是用來創(chuàng)建對象的一種最常用的設(shè)計(jì)模式。我們不暴露創(chuàng)建對象的具體邏輯,而是將將邏輯封裝在一個(gè)函數(shù)中,那么這個(gè)函數(shù)就可以被視為一個(gè)工廠。工廠模式根據(jù)抽象程度的不...
摘要:參考文章深入理解三種工廠模式工廠模式,工廠方法模式,抽象工廠模式詳解工廠模式是中最常用的設(shè)計(jì)模式之一。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。 參考文章:深入理解java三種工廠模式工廠模式,工廠方法模式,抽象工廠模式 詳解 工廠模式(Factory Pattern)是 Java 中最常用的設(shè)計(jì)模式之一。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的...
閱讀 2681·2023-04-25 15:15
閱讀 1320·2021-11-25 09:43
閱讀 1610·2021-11-23 09:51
閱讀 1084·2021-11-12 10:36
閱讀 2886·2021-11-11 16:55
閱讀 959·2021-11-08 13:18
閱讀 730·2021-10-28 09:31
閱讀 2055·2019-08-30 15:47