『设计模式』撩妹秘籍竟是使用设计模式的抽象工厂模式
23種設(shè)計(jì)模式+額外常用設(shè)計(jì)模式匯總 (持續(xù)更新)
引入:可以跳過
如果存在一部撩妹的手機(jī),加上一個(gè)后宮,請問你該怎么做?
砸了手機(jī),跟老婆孩子好好過日子,本篇文章到此結(jié)束!
我們強(qiáng)行分析一波,假設(shè)存在一位叫做志強(qiáng)的男主(沒有在含沙射影)沒有砸掉手機(jī),首先每個(gè)姑娘都會(huì)有名字,防止太多認(rèn)錯(cuò)了。
我們把維系關(guān)系簡單的分成:曖昧–閑聊–約(當(dāng)然是逛商場啦,別想太多) 對于不同的妹子,肯定采用了不同的曖昧,閑聊,約的方式來俘獲他么芳心。
如果重構(gòu)志強(qiáng)與后宮的關(guān)系,那么你會(huì)發(fā)現(xiàn)志強(qiáng)的撩妹方式,直接和名字掛鉤,對于每一位姑娘的曖昧–閑聊–約可以看作是一個(gè)產(chǎn)品族。志強(qiáng)在某一時(shí)刻可以同時(shí)存在多個(gè)姑娘,但是在某一時(shí)刻只能消費(fèi)一位姑娘(指的逛商場,且不包含多人運(yùn)動(dòng)的情況),那么也就是說志強(qiáng)在某一時(shí)刻只消費(fèi)某一產(chǎn)品族。這就是赤裸裸的抽象工廠模式!
我們以一臺(tái)計(jì)算機(jī)主機(jī)為例,機(jī)箱,主板,cpu,內(nèi)存條,顯卡,硬盤是構(gòu)成一臺(tái)主機(jī)的組成部分,這里我們有Dell一套,華碩一套,惠普一套,那么每一套就是產(chǎn)品族,因?yàn)樗麄儼怂薪M成的他們的產(chǎn)品種類,這就是抽象工廠模式。(打錢!!!)
抽象工廠模式
抽象工廠模式(Abstract Factory Pattern)是圍繞一個(gè)超級(jí)工廠創(chuàng)建其他工廠。該超級(jí)工廠又稱為其他工廠的工廠。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。
在抽象工廠模式中,接口是負(fù)責(zé)創(chuàng)建一個(gè)相關(guān)對象的工廠,不需要顯式指定它們的類。每個(gè)生成的工廠都能按照工廠模式提供對象。
意圖:
提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無需指定它們具體的類。
主要解決:
主要解決接口選擇的問題。
何時(shí)使用:
- 希望一個(gè)系統(tǒng)不應(yīng)當(dāng)依賴于產(chǎn)品類實(shí)例如何被創(chuàng)建、組合和表達(dá)的細(xì)節(jié)時(shí)。
- 一個(gè)系統(tǒng)有多于一個(gè)的產(chǎn)品族,而系統(tǒng)只消費(fèi)其中某一產(chǎn)品族
角色:
-
抽象工廠(Abstract Factory)角色:
擔(dān)任這個(gè)角色的是工廠方法模式的核心,它是與應(yīng)用系統(tǒng)商業(yè)邏輯無關(guān)的。 -
具體工廠(Concrete Factory)角色:
這個(gè)角色直接在客戶端的調(diào)用下創(chuàng)建產(chǎn)品的實(shí)例。這個(gè)角色含有選擇合適的產(chǎn)品對
象的邏輯,而這個(gè)邏輯是與應(yīng)用系統(tǒng)的商業(yè)邏輯緊密相關(guān)的 -
抽象產(chǎn)品(Abstract Product)角色:
擔(dān)任這個(gè)角色的類是工廠方法模式所創(chuàng)建的對象的父類,或它們共同擁有的接口。 -
具體產(chǎn)品(Concrete Product)角色:
抽象工廠模式所創(chuàng)建的任何產(chǎn)品對象都是某一個(gè)具體產(chǎn)品類的實(shí)例。
這是客戶端最終需要的東西,其內(nèi)部一定充滿了應(yīng)用系統(tǒng)的商業(yè)邏輯。
廠商看到打錢!😂
與工廠模式的區(qū)別:
- AbstractFactory模式是為創(chuàng)建一組(有多類)相關(guān)或依賴的對象提供創(chuàng)建接口
- Factory模式是為一類對象提供創(chuàng)建接口
優(yōu)缺點(diǎn):
“開放-封閉”原則要求系統(tǒng)對擴(kuò)展開放,對修改封閉。通過擴(kuò)展達(dá)到增強(qiáng)其功能的目的。對于涉及到多個(gè)產(chǎn)品族與多個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)的系統(tǒng),其功能增加包括兩方面:
-
增加產(chǎn)品族:Abstract Factory很好的支持了"開放-封閉開放-封閉"原則
-
增加新產(chǎn)品的等級(jí)結(jié)構(gòu):需要修改所有的工廠角色,沒有很好支持“開放-封閉”原則。
-
綜合起來,抽象工廠模式以一種傾斜的方式支持增加新的產(chǎn)品,它為新產(chǎn)品族的增加提供方便,而不能為新的產(chǎn)品等級(jí)結(jié)構(gòu)的增加提供這樣的方便。
當(dāng)一個(gè)產(chǎn)品族中的多個(gè)對象被設(shè)計(jì)成一起工作時(shí),它能保證客戶端始終只使用同一個(gè)產(chǎn)品族中的對象。
產(chǎn)品族擴(kuò)展非常困難,要增加一個(gè)系列的某一產(chǎn)品,既要在抽象的 Creator 里加代碼,又要在具體的里面加代碼。
解決方案: 反射
UML圖
實(shí)現(xiàn)
UML類似上面的,在重新給出一遍。
IProductA
IProductB
package AbstractFactory; public interface IProductB {//每個(gè)產(chǎn)品共有的方法public void shareMethod() ;// 每個(gè)產(chǎn)品相同方法,不同實(shí)現(xiàn)public void doSomething(); }ProductA1
package AbstractFactory; public class ProductA1 implements IProductA {public void doSomething() {System.out.println("我是產(chǎn)品A1");}@Overridepublic void shareMethod() {// TODO Auto-generated method stub} }ProductA2
package AbstractFactory; public class ProductA2 implements IProductA {public void doSomething() {System.out.println("我是產(chǎn)品A2");}@Overridepublic void shareMethod() {// TODO Auto-generated method stub} }ProductB1
package AbstractFactory; public class ProductB1 implements IProductB {public void doSomething() {System.out.println("我是產(chǎn)品B1");}@Overridepublic void shareMethod() {// TODO Auto-generated method stub} }ProductB2
package AbstractFactory; public class ProductB2 implements IProductB {public void doSomething() {System.out.println("我是產(chǎn)品B2");}@Overridepublic void shareMethod() {// TODO Auto-generated method stub} }ICreator
package AbstractFactory; public interface ICreator {//創(chuàng)建A產(chǎn)品public IProductA createProductA();//創(chuàng)建B產(chǎn)品public IProductB createProductB(); }Creator1
package AbstractFactory; public class Creator1 implements ICreator {public IProductA createProductA() {return new ProductA1();}public IProductB createProductB() {return new ProductB1();} }Creator2
package AbstractFactory; public class Creator2 implements ICreator {public IProductA createProductA() {return new ProductA2();}public IProductB createProductB() {return new ProductB2();} }Client
package AbstractFactory;public class Client {public static void main(String[] args) {//定義出兩個(gè)工廠ICreator creator1 = new Creator1();ICreator creator2 = new Creator2();//產(chǎn)生A1對象IProductA a1 = creator1.createProductA();//產(chǎn)生A2對象IProductA a2 = creator2.createProductA();//產(chǎn)生B1對象IProductB b1 = creator1.createProductB();//產(chǎn)生B2對象IProductB b2 = creator2.createProductB();a1.doSomething();a2.doSomething();b1.doSomething();b2.doSomething();} }運(yùn)行結(jié)果
!!!使用反射加配置文件解耦實(shí)現(xiàn)上述過程
去掉所有Creator相關(guān),其余不變。
加上以下內(nèi)容:
老有人私信我,說我博客表情包花里胡哨的,我想說,我不放表情包,部分小伙伴不一定能看完整篇文章,以后會(huì)減少出現(xiàn),但一定不會(huì)缺席。😂
寫在最后:
我叫風(fēng)骨散人,名字的意思是我多想可以不低頭的自由生活,可現(xiàn)實(shí)卻不是這樣。家境貧寒,總得向這個(gè)世界低頭,所以我一直在奮斗,想改變我的命運(yùn)給親人好的生活,希望同樣被生活綁架的你可以通過自己的努力改變現(xiàn)狀,深知成年人的世界里沒有容易二字。目前是一名在校大學(xué)生,預(yù)計(jì)考研,熱愛編程,熱愛技術(shù),喜歡分享,知識(shí)無界,希望我的分享可以幫到你!
如果有什么想看的,可以私信我,如果在能力范圍內(nèi),我會(huì)發(fā)布相應(yīng)的博文!
感謝大家的閱讀!😘你的點(diǎn)贊、收藏、關(guān)注是對我最大的鼓勵(lì)!
總結(jié)
以上是生活随笔為你收集整理的『设计模式』撩妹秘籍竟是使用设计模式的抽象工厂模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 效率提升三倍!研究称调整脑电波能加速成人
- 下一篇: asp.net ajax控件工具集 Au