设计模式之---工厂模式、建造者模式
? 對于工廠模式,個人學習需要掌握
- 注意答案的重點標黑了。對于工廠模式、建造者模式,掌握,我下面這幾點就很棒棒。
一、工廠模式
1、什么是工廠模式:【關(guān)鍵字factory】
答:創(chuàng)建對象時,不直接new,而是交由一個工廠類/工廠接口的工廠方法負責創(chuàng)建。
2、工廠模式的意義
答:將實例化對象的代碼提取出來,放到一個類(工廠類)中統(tǒng)一管理和維護;實現(xiàn)了創(chuàng)建者和調(diào)用者的分離,達到和主項目的依賴關(guān)系的解耦。從而提高項目的擴展和維護性。
3、工廠模式包括哪三種
答:簡單工廠模式、工廠方法模式、抽象工廠模式
4、工廠模式的使用對比[簡單工廠模式和工廠方法模式對比]:
答:簡單工廠模式:雖然某種程度上不符合設計原則,但實際使用最多;工廠方法模式:不修改已有類的前提下,通過增加新的工廠類實現(xiàn)擴展;抽象工廠模式:不可以增加產(chǎn)品,可以增加產(chǎn)品族。
★ 雖然簡單工廠模式不符合理論中的開閉原則,但是工廠方法模式定義的大量子類工廠實現(xiàn)類,管理也非常麻煩,實際開發(fā)中使用的最多是簡單工廠模式.
5、抽象工廠是什么
答:是工廠的工廠,超級工廠。適合生產(chǎn)一個穩(wěn)定的產(chǎn)品族,采用抽象工廠模式不需要關(guān)心構(gòu)建過程,只關(guān)心什么產(chǎn)品由什么工廠生產(chǎn)即可。
6、工廠模式的應用場景:
- jdk中calendar的getInstance方法----簡單工廠模式
- JDBC中的Connection對象的獲取
- Spring中的IOC容器創(chuàng)建管理bean對象
- 反射中Class對象的newInstance方法
二、建造者模式
1、什么是建造者模式:【關(guān)鍵字builder】
答:又叫生成器模式,是一種對象構(gòu)建模式。將一個復雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。
2、四種角色是什么
答:
(1) Product(產(chǎn)品角色):一個具體的產(chǎn)品對象。
(2) Builder(抽象建造者): 創(chuàng)建一個產(chǎn)品對象的各個部件的接口/抽象類。
(3) ConcreteBuilder(具體建造者): 實現(xiàn)或繼承抽象建造者接口,具體地構(gòu)建和裝配各個部件。
(4) Director(指揮者): 構(gòu)建一個使用Builder接口的對象。它主要是用于創(chuàng)建一個復雜的對象。負責指揮構(gòu)建一個工程,決定了工程如何構(gòu)建,按照什么順序構(gòu)建。
舉例:建造房子:
需要建房子:這一過程為打樁、砌墻、封頂。不管是普通房子也好,別墅也好都 需要經(jīng)歷這些過程,下面我們使用建造者模式(Builder Pattern)來完成.
1、產(chǎn)品角色:Product-房子,定義了房子的屬性
2、抽象建造者:Builder-抽象的工人,定義了一些建造房子組件的方法和接口
3、具體建造者:ConcreteBuilder-具體的工人,實現(xiàn)了建造房子組件
4、指揮者:Director-房子的指揮設計者,:負責指揮構(gòu)建一個工程,決定了工程如何構(gòu)建,按照什么順序構(gòu)建
3、建造者模式在JDK的應用和源碼分析 (java.lang.StringBuilder中的建造者模式)
答:源碼中建造者模式角色分析:
(1) Appendable接口,是抽象建造者, 定義了抽象方法,定義了多個append方法(抽象方法)
(2) AbstractStringBuilder抽象類,實現(xiàn)了 Appendable接口方法,AbstractStringBuilder 是建造者,只是不能實例化
(3)StringBuilder 繼承了AbstractStringBuilder,即充當了指揮者角色,同時充當了具體的建造者,建造方法的實現(xiàn)是由 AbstractStringBuilder 完成, 而StringBuilder 繼承了 AbstractStringBuilder
4、建造者模式的優(yōu)缺點:
答:優(yōu)點:(1) 產(chǎn)品的建造和表示分離,實現(xiàn)了解耦。使用建造者模式可以使客戶端不必知道產(chǎn)品內(nèi)部組成的細節(jié);
? (2) 用戶使用不同的具體建造者即可得到不同的產(chǎn)品對象;
? (3) 增加新的具體建造者無需修改原有類庫代碼,符合“開閉原則”
缺點:建造者模式所創(chuàng)建的產(chǎn)品一般具有較多的共同點,其組成部分相似;如果產(chǎn)品之間的差異性很大,則不適合使用建造者模式
5、抽象工廠模式VS建造者模式
答:抽象工廠模式實現(xiàn)對產(chǎn)品家族的創(chuàng)建,一個產(chǎn)品家族是這樣的一系列產(chǎn)品,采用抽象工廠模式不需要關(guān)心構(gòu)建過程,只關(guān)心什么產(chǎn)品 由什么工廠生產(chǎn)即可。而建造者模式則是要求按照指定的藍圖建造產(chǎn)品,它的主要目的是通過組裝零配件而產(chǎn)生一個新產(chǎn)品。
一、工廠設計模式
1、作用和意義:實現(xiàn)了創(chuàng)建者和調(diào)用者的分離。
★ 工廠模式的意義:將實例化對象的代碼提取出來,放到一個類(工廠類)中統(tǒng)一管理和維護,達到和主項目的依賴關(guān)系的解耦。從而提高項目的擴展和維護性。
2、三種工廠模式:
簡單工廠模式、工廠方法模式、抽象工廠模式
3、 設計模式的依賴抽象原則:
? 創(chuàng)建對象實例時,不要直接 new 類, 而是把這個new 類的動作放在一個工廠的方法中,并返回。
? 不要讓類繼承具體類,而是繼承抽象類或者是實現(xiàn)interface(接口)
? 不要覆蓋基類中已經(jīng)實現(xiàn)的方法
4、核心本質(zhì):
實例化對象不使用new,用工廠方法代替 factory
將選擇實現(xiàn)類,創(chuàng)建對象統(tǒng)一管理和控制。從而將調(diào)用者跟我們的實現(xiàn)類解耦
■ 簡單工廠模式(靜態(tài)工廠模式)
用來生產(chǎn)同一等級結(jié)構(gòu)中的任意產(chǎn)品(對于增加新的產(chǎn)品,需要擴展已有代碼)
★ 對于簡單工廠模式的舉例:消費者買車
情況一:在沒有使用簡單工廠模式下,消費者(Consumer類)要買車,需要自己 new來構(gòu)建一輛自己想要買的車?!拘枰M者自己制作車 (new 構(gòu)建 車對象),則消費者是需要車的內(nèi)部細節(jié),才能new出車對象】
情況二:使用簡單工廠模式下,消費者只需要調(diào)用汽車工廠(CarFactory類)的獲取車的方法,就可以買車了,不用關(guān)系車的創(chuàng)建的各種細節(jié)。而汽車工廠(CarFactory類)作用就是來制作車 (new 構(gòu)建 車對象)的,并為外界提供獲取車對象的方法。
public class Consumer {public static void main(String[] args) {// 1、沒有使用簡單工廠模式的情況:// Car car = new WuLing();// Car car1 = new Tesla();// 2、使用工廠創(chuàng)建Car car = CarFactory.getCar("wuling");Car car1 = CarFactory.getCar("tesila");car.name();car1.name();} }public interface Car {void name(); }public class WuLing implements Car{@Overridepublic void name() {System.out.println("五菱宏光");} }public class Tesla implements Car{@Overridepublic void name() {System.out.println("特斯拉");} }// 靜態(tài)工廠模式 // 開閉原則 public class CarFactory {// 方法一: 不滿足開閉原則public static Car getCar(String car){if(car.equals("wuling")){return new WuLing();}else if(car.equals("tesila")){return new Tesla();}else {return null;}}// 方法二:public static Car geyWuling(){return new WuLing();}public static Car geyTesla(){return new Tesla();}}□ 弊端:增加一個新的產(chǎn)品,做不到不修改代碼。
例如:擴展一個大眾的汽車,則需要修改工廠類(CarFactory)的Car(String car)方法的代碼,不符合開閉原則【對擴展開發(fā),對修改關(guān)閉】。
- 解決:工廠方法模式
■ 工廠方法模式:
用來生產(chǎn)同一等級結(jié)構(gòu)中的固定產(chǎn)品(支持增加任意產(chǎn)品)
public class Consumer {public static void main(String[] args) {Car car = new WulingFactory().getCar();Car car1 = new TeslaFactory().getCar();car.name();car1.name();Car car2 = new MoBaiFactory().getCar();car2.name();} }public interface Car {void name(); }public class WuLing implements Car {@Overridepublic void name() {System.out.println("五菱宏光");} }public class Tesla implements Car {@Overridepublic void name() {System.out.println("特斯拉");} }// 工廠方法模式 public interface CarFactory {Car getCar(); }public class WulingFactory implements CarFactory{@Overridepublic Car getCar() {return new WuLing();} }public class TeslaFactory implements CarFactory{@Overridepublic Car getCar() {return new Tesla();} }■ 工廠方法模式:通過將簡單工廠模式原先的工廠類抽象成接口,然后根據(jù)車的種類,決定了抽象工廠接口的子類工廠實現(xiàn)類,并在子類工廠實現(xiàn)類內(nèi)創(chuàng)建對應車種類的對象。
- 舉例:現(xiàn)在多了一個車的品牌,叫寶馬,相應的車工廠就有寶馬工廠(實現(xiàn)工廠接口),在寶馬車工廠實現(xiàn)了制作寶馬車的方法。
3、理論和實際應用對比【對比簡單工廠模式和工廠方法模式】
1、結(jié)構(gòu)復雜度:simple>method
2、代碼復雜度:simple>method
3、編程復雜度:simple>method
4、管理上的復雜度:simple>method
★ 雖然簡單工廠模式不符合理論中的開閉原則,但是工廠方法模式定義的大量子類工廠實現(xiàn)類,管理也非常麻煩,實際開發(fā)中使用的最多是簡單工廠模式
4、抽象工廠模式:“工廠的工廠,超級工廠。適合生產(chǎn)一個穩(wěn)定的產(chǎn)品族”
圍繞一個超級工廠創(chuàng)建其他工廠。該超級工廠又稱為其他工廠的工廠
(1) 定義:
抽象工廠模式提供了一個創(chuàng)建一系列相關(guān)或者相互依賴對象的接口,無需指定他們的具體的類(針對整個產(chǎn)品族,產(chǎn)品等級數(shù)量相對固定的產(chǎn)品族)
(2) 適用場景:
- 客戶端(應用層)不依賴于產(chǎn)品類實例如何被創(chuàng)建、實現(xiàn)等細節(jié)
- 強調(diào)一系列相關(guān)的產(chǎn)品對象(屬于同一產(chǎn)品族)一起使用創(chuàng)建對象需要大量的重復代碼
- 提供一個產(chǎn)品類的庫,所有的產(chǎn)品以同樣的接口出現(xiàn),從而使得客戶端不依賴于具體實現(xiàn)
■ 抽象工廠模式-其實就是工廠方法模式的抽象,體現(xiàn)在將原先的工廠定義為超級工廠接口,且包含的屬性成員也是接口。
1、定義一個超級工廠接口IProductFactory:包含兩個產(chǎn)品接口(接口屬性成員)-手機產(chǎn)品接口IphoneProduct、路由器產(chǎn)品接口IRouterProduct 【產(chǎn)品族】
2、然后超級工廠接口有具體的實現(xiàn)子類-小米工廠XiaomiFactory、華為工廠HuaweiFactory
3、對于超級工廠接口定義的接口屬性成員有對應的實現(xiàn)子類
-
然后手機產(chǎn)品接口IphoneProduct有具體的實現(xiàn)子類-小米手機實現(xiàn)子類XiaomiPhone、華為手機實現(xiàn)子類HuaweiPhone
-
同樣路由器產(chǎn)品接口IRouterProduct 也有具體的實現(xiàn)子類-小米路由實現(xiàn)子類XiaomiRouter、華為路由實現(xiàn)子類HuaweiRouter
(3) 抽象工廠模式優(yōu)缺點:
優(yōu)點
-
具體產(chǎn)品在應用層的代碼隔離,無需關(guān)心創(chuàng)建的細節(jié)
-
將一個系列的產(chǎn)品統(tǒng)一到一起創(chuàng)建
缺點:
-
規(guī)定了所有可能被創(chuàng)建的產(chǎn)品集合,產(chǎn)品族中擴展新的產(chǎn)品困難;
-
增加了系統(tǒng)的抽象性和理解難度
5、工廠模式小結(jié):
-
簡單工廠模式:雖然某種程度上不符合設計原則,但實際使用最多
-
工廠方法模式:不修改已有類的前提下,通過增加新的工廠類實現(xiàn)擴展
-
抽象工廠模式:不可以增加產(chǎn)品,可以增加產(chǎn)品族
6、工廠模式的應用場景:
-
jdk中calendar的getInstance方法----簡單工廠模式
-
JDBC中的Connection對象的獲取
-
Spring中的IOC容器創(chuàng)建管理bean對象
-
反射中Class對象的newInstance方法
二、建造者模式
它提供了一種創(chuàng)建對象的最佳方式
1、定義:
將一個復雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。
建造者模式(Builder Pattern) 又叫生成器模式,是一種對象構(gòu)建模式。它可以將復雜對象的建造過程抽象出來(抽象類別),使這個抽象過程的不同實現(xiàn)方法可以構(gòu)造出不同表現(xiàn)(屬性)的對象。
2、主要作用:
在用戶不知道 對象的建造過程和細節(jié)的情況下就可以直接創(chuàng)建復雜的對象。
用戶只需要給出指定復雜對象的類型和內(nèi)容,建造者牧師負責按順序創(chuàng)建復雜對象(把內(nèi)部的建造過程和細節(jié)隱藏起來)
3、四種角色[★ 結(jié)合第四點的建造房子理解]
1) Product(產(chǎn)品角色):一個具體的產(chǎn)品對象。
2) Builder(抽象建造者): 創(chuàng)建一個Product對象的各個部件指定的 接口/抽象類。
3) ConcreteBuilder(具體建造者): 實現(xiàn)接口,構(gòu)建和裝配各個部件。
4) Director(指揮者): 構(gòu)建一個使用Builder接口的對象。它主要是用于創(chuàng)建一個復雜的對象。
它主要有兩個作用,一是:隔離了客戶與對象的生產(chǎn)過程,二是:負責控制產(chǎn)品對象的生產(chǎn)過程。
4、舉例:建造房子
需要建房子:這一過程為打樁、砌墻、封頂。不管是普通房子也好,別墅也好都 需要經(jīng)歷這些過程,下面我們使用建造者模式(Builder Pattern)來完成.
1、產(chǎn)品角色:Product-房子,定義了房子的屬性
2、抽象建造者:Builder-抽象的工人,定義了一些建造房子組件的方法和接口
3、具體建造者:ConcreteBuilder-具體的工人,實現(xiàn)了建造房子組件
4、指揮者:Director-房子的指揮設計者,:核心負責指揮構(gòu)建一個工程,決定了工程如何構(gòu)建,按照什么順序構(gòu)建
// 產(chǎn)品:房子[定義了房子的屬性] public class Product {private String buildA;private String buildB;private String buildC;private String buildD;public String getBuildA() {return buildA;}public void setBuildA(String buildA) {this.buildA = buildA;}public String getBuildB() {return buildB;}public void setBuildB(String buildB) {this.buildB = buildB;}public String getBuildC() {return buildC;}public void setBuildC(String buildC) {this.buildC = buildC;}public String getBuildD() {return buildD;}public void setBuildD(String buildD) {this.buildD = buildD;}@Overridepublic String toString() {return "Product{" +"buildA='" + buildA + '\'' +", buildB='" + buildB + '\'' +", buildC='" + buildC + '\'' +", buildD='" + buildD + '\'' +'}';} }// 抽象的建造者[抽象的工人]:只是定義一些方法和接口 public abstract class Builder {abstract void buildA(); // 地基abstract void buildB(); // 鋼筋工程abstract void buildC(); // 鋪電線abstract void buildD(); // 粉刷// 完工:得到產(chǎn)品abstract Product getProduct(); }// 具體的建造者[工人]: public class Worker extends Builder {private Product product;public Worker() {product = new Product();// 工人負責創(chuàng)建產(chǎn)品}@Overridevoid buildA() {product.setBuildA("地基");System.out.println("地基");}@Overridevoid buildB() {product.setBuildB("鋼筋工程");System.out.println("鋼筋工程");}@Overridevoid buildC() {product.setBuildC("鋪電線");System.out.println("鋪電線");}@Overridevoid buildD() {product.setBuildD("粉刷");System.out.println("粉刷");}@OverrideProduct getProduct() {return product;} }// 指揮者:核心負責指揮構(gòu)建一個工程,工程如何構(gòu)建,按照什么順序構(gòu)建,由他決定 public class Director {// 指揮工人按照順序建房子public Product build(Builder builder){builder.buildA();builder.buildB();builder.buildC();builder.buildD();return builder.getProduct();} }public class Test {public static void main(String[] args) {// 指揮Director director = new Director();// 指揮 具體的工人 完成產(chǎn)品Product build = director.build(new Worker());System.out.println(build.toString());} }5、建造者模式在JDK的應用和源碼分析 (java.lang.StringBuilder中的建造者模式)
■ 源碼中建造者模式角色分析
? Appendable接口,是抽象建造者, 定義了抽象方法,定義了多個append方法(抽象方法)
? AbstractStringBuilder抽象類,實現(xiàn)了 Appendable接口方法,AbstractStringBuilder 是建造者,只是不能實例化
? StringBuilder 繼承了AbstractStringBuilder,即充當了指揮者角色,同時充當了具體的建造者,建造方法的實現(xiàn)是由 AbstractStringBuilder 完成, 而StringBuilder 繼承了 AbstractStringBuilder
6、建造者模式的優(yōu)缺點
優(yōu)點:
- 產(chǎn)品的建造和表示分離,實現(xiàn)了解耦。使用建造者模式可以使客戶端不必知道產(chǎn)品內(nèi)部組成的細節(jié)
- 用戶使用不同的具體建造者即可得到不同的產(chǎn)品對象
- 將復雜產(chǎn)品的創(chuàng)建步驟分解在不同的方法中,是得創(chuàng)建過程更加清晰
- 具體的建造者之間是相互獨立的,這有利于系統(tǒng)的擴展。增加新的具體建造者無需修改原有類庫代碼,符合“開閉原則”
缺點:
- 建造者模式所創(chuàng)建的產(chǎn)品一般具有較多的共同點,其組成部分相似;如果產(chǎn)品之間的差異性很大,則不適合使用建造者模式,因此其使用范圍受到一定的限制
- 如果產(chǎn)品的內(nèi)部變化復雜,可能會導致需要定義很多具體建造者類來實現(xiàn)這種變化,導致系統(tǒng)變的很龐大
7、抽象工廠模式VS建造者模式
抽象工廠模式實現(xiàn)對產(chǎn)品家族的創(chuàng)建,一個產(chǎn)品家族是這樣的一系列產(chǎn)品:具有不同分類維度的產(chǎn)品組合,采用抽象工廠模式不需要關(guān)心構(gòu)建過程,只關(guān)心什么產(chǎn)品 由什么工廠生產(chǎn)即可。
而建造者模式則是要求按照指定的藍圖建造產(chǎn)品,它的主要目的是通過組裝零配件而產(chǎn)生一個新產(chǎn)品。
參考內(nèi)容來源:《尚硅谷Java設計模式(圖解+框架源碼剖析)》 https://www.bilibili.com/video/BV1G4411c7N4
《【狂神說Java】通俗易懂的23種設計模式教學(停更)》https://www.bilibili.com/video/BV1mc411h719?p=5
如果本文對你有幫助的話記得給一樂點個贊哦,感謝!
總結(jié)
以上是生活随笔為你收集整理的设计模式之---工厂模式、建造者模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 订地方报纸的女人
- 下一篇: 法国现在是第五共和国,前四个哪儿去了?