北风设计模式课程---7、建造者模式
北風(fēng)設(shè)計(jì)模式課程---7、建造者模式
一、總結(jié)
一句話總結(jié):
設(shè)計(jì)模式都是對生活中好的做事方法的一些抽象,使得各司其職,減少出錯。
建造者模式可以看做模仿的生活中:設(shè)計(jì)師,施工隊(duì)做復(fù)雜房子交給客戶的場景
角色:學(xué)設(shè)計(jì)模式分清角色就很簡單了
?
1、建造者模式是什么?
1、造房子:隱藏復(fù)合對象的創(chuàng)建過程
2、不同施工隊(duì):把復(fù)合對象的創(chuàng)建過程加以抽象,通過子類繼承和重載的方式,動態(tài)地創(chuàng)建
3、用戶:用戶單純的從施工隊(duì)那里接收房子即可
用來隱藏復(fù)合對象的創(chuàng)建過程,它把復(fù)合對象的創(chuàng)建過程加以抽象,通過子類繼承和重載的方式,動態(tài)地創(chuàng)建具有復(fù)合屬性的對象。
?
2、建造者模式實(shí)例?
1、房子基類:比如修房子,有房子基類,如果直接讓用戶修房子的話,修不同的房子修改麻煩
2、施工隊(duì):找工程隊(duì)(接口)來修,如果修平房就找修平房的建造工人(接口實(shí)例),如果修樓房就找修樓房的建造工人(接口實(shí)例),這些具體的工人要返回實(shí)例出去的,修房子的過程就是修改房子基類屬性的過程
3、設(shè)計(jì)師:有設(shè)計(jì)師角色,設(shè)計(jì)師角色指導(dǎo)工程隊(duì)來修房子,設(shè)計(jì)師里面有工程隊(duì)的實(shí)例,方便指揮工程隊(duì)做事
?
3、建造者模式的修房子實(shí)例的核心代碼示例?
1、找具體工程隊(duì):HouseBuilder builder = new GongyuBuilder(); //比如這里修公寓 //由工程隊(duì)來修
2、設(shè)計(jì)師指導(dǎo)工程隊(duì)做:HouseDirector director = new HouseDirector(); director.makeHouse(builder);
3、第二步中可以弄成靜態(tài)方法來優(yōu)化一下
?
4、建造者模式應(yīng)用場景是什么?
1、創(chuàng)建對象的時候:Builder模式是為對象的創(chuàng)建而設(shè)計(jì)的模式
2、創(chuàng)建的是一個復(fù)合對象:被創(chuàng)建的對象為一個具有復(fù)合屬性的復(fù)合對象
3、關(guān)注對象創(chuàng)建的各部分的創(chuàng)建過程:不同的工廠(這里指builder生成器)對產(chǎn)品屬性有不同的創(chuàng)建方法
?
5、建造者模式的實(shí)質(zhì)是什么?
施工隊(duì):做房子由專門的施工隊(duì)來做
設(shè)計(jì)師:施工隊(duì)怎么做由設(shè)計(jì)師來指導(dǎo)
用戶:直接接收施工隊(duì)做好的house即可
?
6、建造者模式的優(yōu)缺點(diǎn)是什么?
1、方便用戶:用戶不必關(guān)注復(fù)雜房子的創(chuàng)建過程,直接從施工隊(duì)手里拿房子即可
2、不同施工隊(duì)各司其職:建造不同的房子,或者建造房子中不同的部位,有不同的施工隊(duì)
?
7、legend2項(xiàng)目中如何使用建造者模式(比如構(gòu)建獎勵的數(shù)據(jù))?
施工隊(duì):比如構(gòu)建獎勵的數(shù)據(jù),不同的施工隊(duì)構(gòu)建不同類型的獎勵,比如裝備、特性書等
設(shè)計(jì)師:有一個設(shè)計(jì)師,來負(fù)責(zé)指導(dǎo)施工隊(duì)該怎么做
用戶:用戶只管得到施工隊(duì)處理好的數(shù)據(jù)即可
?
?
?
?
二、內(nèi)容在總結(jié)中
1、相關(guān)知識
?
2、代碼
房子基類:House.java
施工隊(duì)接口:HouseBuilder.java
平房施工隊(duì)(實(shí)現(xiàn)施工隊(duì)接口):PingFangBuilder.java:做平房
公寓施工隊(duì)(實(shí)現(xiàn)施工隊(duì)接口):GongyuBuilder.java:做公寓
設(shè)計(jì)師:HouseDirector.java:指導(dǎo)具體施工隊(duì)如何做房子
用戶-主類: MainClass.java:獲取具體施工隊(duì)做好的房子
?
房子基類:House.java
1 /* 2 * ·?×ó 3 */ 4 public class House { 5 // μ?°? 6 private String floor; 7 // ?? 8 private String wall; 9 // ?Y?¥ 10 private String housetop; 11 12 public String getFloor() { 13 return floor; 14 } 15 16 public void setFloor(String floor) { 17 this.floor = floor; 18 } 19 20 public String getWall() { 21 return wall; 22 } 23 24 public void setWall(String wall) { 25 this.wall = wall; 26 } 27 28 public String getHousetop() { 29 return housetop; 30 } 31 32 public void setHousetop(String housetop) { 33 this.housetop = housetop; 34 } 35 36 }?
?
施工隊(duì)接口:HouseBuilder.java
/** 1¤3ì?ó*/ public interface HouseBuilder {//DTμ?°?public void makeFloor();//DT??public void makeWall();//DT?Y?¥public void makeHousetop();public House getHouse(); }?
?
平房施工隊(duì)(實(shí)現(xiàn)施工隊(duì)接口):PingFangBuilder.java:做平房
/** 平房工程隊(duì)*/public class PingFangBuilder implements HouseBuilder {House house = new House();public void makeFloor() {house.setFloor("平房-->地板");}public void makeHousetop() {house.setHousetop("平房-->房頂");}public void makeWall() {house.setWall("平房-->墻");}public House getHouse() {return house;}}?
?
公寓施工隊(duì)(實(shí)現(xiàn)施工隊(duì)接口):GongyuBuilder.java:做公寓
public class GongyuBuilder implements HouseBuilder{House house = new House();public House getHouse() {return house;}public void makeFloor() {house.setFloor("公寓-->地板");}public void makeHousetop() {house.setHousetop("公寓-->房頂");}public void makeWall() {house.setWall("公寓-->墻");}}?
?
設(shè)計(jì)師:HouseDirector.java:指導(dǎo)具體施工隊(duì)如何做房子
public class HouseDirector { public void makeHouse(HouseBuilder builder) {builder.makeFloor();builder.makeWall();builder.makeHousetop();}}?
?
用戶-主類: MainClass.java:獲取具體施工隊(duì)做好的房子 public class MainClass {public static void main(String[] args) { // //客戶直接造房子 // House house = new House(); // house.setFloor("地板"); // house.setWall("墻"); // house.setHousetop("屋頂");//由工程隊(duì)來修HouseBuilder builder = new GongyuBuilder();//設(shè)計(jì)者來做HouseDirector director = new HouseDirector();director.makeHouse(builder);House house = builder.getHouse();System.out.println(house.getFloor());System.out.println(house.getWall());System.out.println(house.getHousetop());}}?
三、java設(shè)計(jì)模式-----6、建造者模式
轉(zhuǎn)自或參考:java設(shè)計(jì)模式-----6、建造者模式
https://www.cnblogs.com/xiaobai1226/p/8507239.html
Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23種設(shè)計(jì)模式中的一種。Builder模式是一種對象創(chuàng)建型模式之一,用來隱藏復(fù)合對象的創(chuàng)建過程,它把復(fù)合對象的創(chuàng)建過程加以抽象,通過子類繼承和重載的方式,動態(tài)地創(chuàng)建具有復(fù)合屬性的對象。
建造者模式的結(jié)構(gòu)
?
角色
在這樣的設(shè)計(jì)模式中,有以下幾個角色:
1 builder:為創(chuàng)建一個產(chǎn)品對象的各個部件指定抽象接口。
2 ConcreteBuilder:實(shí)現(xiàn)Builder的接口以構(gòu)造和裝配該產(chǎn)品的各個部件,定義并明確它所創(chuàng)建的表示,并提供一個檢索產(chǎn)品的接口。
3 Director:構(gòu)造一個使用Builder接口的對象。
4 Product:表示被構(gòu)造的復(fù)雜對象。ConcreteBuilder創(chuàng)建該產(chǎn)品的內(nèi)部表示并定義它的裝配過程,包含定義組成部件的類,包括將這些部件裝配成最終產(chǎn)品的接口。
?
首先,舉個例子,建造者模式我們比方我們要造個房子。
房子的圖紙
1 public class House { 2 //地板 3 private String floor; 4 //墻 5 private String wall; 6 //房頂 7 private String roof; 8 9 public String getFloor() { 10 return floor; 11 } 12 public void setFloor(String floor) { 13 this.floor = floor; 14 } 15 public String getWall() { 16 return wall; 17 } 18 public void setWall(String wall) { 19 this.wall = wall; 20 } 21 public String getRoof() { 22 return roof; 23 } 24 public void setRoof(String roof) { 25 this.roof = roof; 26 } 27 }有了圖紙后,最笨的方法就是自己造房子
客戶端
1 public class MainClass { 2 public static void main(String[] args) { 3 //客戶直接造房子 4 House house = new House(); 5 6 house.setFloor("地板"); 7 house.setWall("墻"); 8 house.setRoof("屋頂"); 9 10 System.out.println(house.getFloor()); 11 System.out.println(house.getWall()); 12 System.out.println(house.getRoof()); 13 } 14 }可是這樣的方法不是很好,真正我們造房子都是找施工隊(duì),所以我們要把造房子分離出來,交給施工隊(duì)
新建一個施工隊(duì),為了擴(kuò)展性,聲明一個施工隊(duì)的接口
1 public interface HouseBuilder { 2 //修地板 3 public void makeFloor(); 4 //修墻 5 public void makeWall(); 6 //修屋頂 7 public void makeRoof(); 8 //獲得修好的房子 9 public House getHouse(); 10 }新建一個施工隊(duì),實(shí)現(xiàn)此接口
1 public class LoufangBuilder implements HouseBuilder{ 2 House house = new House(); 3 4 @Override 5 public void makeFloor() { 6 house.setFloor("樓房->地板"); 7 } 8 9 @Override 10 public void makeWall() { 11 house.setWall("樓房->墻"); 12 } 13 14 @Override 15 public void makeRoof() { 16 house.setRoof("樓房->屋頂"); 17 } 18 19 @Override 20 public House getHouse() { 21 return house; 22 } 23 }客戶端
1 public class MainClass { 2 public static void main(String[] args) { 3 //施工隊(duì)造房子 4 HouseBuilder loufangBuilder = new LoufangBuilder(); 5 loufangBuilder.makeFloor(); 6 loufangBuilder.makeWall(); 7 loufangBuilder.makeRoof(); 8 9 House house = loufangBuilder.getHouse(); 10 System.out.println(house.getFloor()); 11 System.out.println(house.getWall()); 12 System.out.println(house.getRoof()); 13 } 14 }可以看到,這樣子造房子就交給施工隊(duì)了,但可以看到造房子的具體細(xì)節(jié)還在客戶端里,如圖。
這就相當(dāng)于我們在指導(dǎo)施工隊(duì)干活,這肯定不是最好的方案,最好的解決方案,是由一個設(shè)計(jì)師也可以說是指揮者來指導(dǎo)工程隊(duì),所以在新建一個指揮者
1 public class HouseDirector { 2 private HouseBuilder houseBuilder; 3 4 public HouseDirector(HouseBuilder houseBuilder){ 5 this.houseBuilder = houseBuilder; 6 } 7 8 public void make(){ 9 houseBuilder.makeFloor(); 10 houseBuilder.makeWall(); 11 houseBuilder.makeRoof(); 12 } 13 }?
? 客戶端
1 public class MainClass { 2 public static void main(String[] args) { 3 //施工隊(duì)造房子 4 HouseBuilder loufangBuilder = new LoufangBuilder(); 5 // loufangBuilder.makeFloor(); 6 // loufangBuilder.makeWall(); 7 // loufangBuilder.makeRoof(); 8 HouseDirector houseDirector = new HouseDirector(loufangBuilder); 9 houseDirector.make(); 10 11 House house = loufangBuilder.getHouse(); 12 System.out.println(house.getFloor()); 13 System.out.println(house.getWall()); 14 System.out.println(house.getRoof()); 15 } 16 }這樣子,把施工隊(duì)交給這個設(shè)計(jì)者,施工細(xì)節(jié)的工作就由這個設(shè)計(jì)者執(zhí)行了。
當(dāng)然,還有一種寫法,有一些細(xì)微的改動,也是更常用的,就是設(shè)計(jì)者(Director)不在構(gòu)造時傳入builder,而是在調(diào)用方法時,才傳入,像這樣
1 public class HouseDirector { 2 public void make(HouseBuilder houseBuilder){ 3 houseBuilder.makeFloor(); 4 houseBuilder.makeWall(); 5 houseBuilder.makeRoof(); 6 } 7 }客戶端
1 public class MainClass { 2 public static void main(String[] args) { 3 //施工隊(duì)造房子 4 HouseBuilder loufangBuilder = new LoufangBuilder(); 5 6 HouseDirector houseDirector = new HouseDirector(); 7 houseDirector.make(loufangBuilder); 8 9 House house = loufangBuilder.getHouse(); 10 System.out.println(house.getFloor()); 11 System.out.println(house.getWall()); 12 System.out.println(house.getRoof()); 13 } 14 }這樣子,出來的效果是一樣的。
這就是一個簡單的建造者模式
這樣也提高了系統(tǒng)的擴(kuò)展性與可維護(hù)性,如果不想造樓房了,想造一個別墅,只需新增一個別墅施工隊(duì)就好了,像這樣
1 public class BieshuBuilder implements HouseBuilder{ 2 House house = new House(); 3 4 @Override 5 public void makeFloor() { 6 house.setFloor("別墅->地板"); 7 } 8 9 @Override 10 public void makeWall() { 11 house.setWall("別墅->墻"); 12 } 13 14 @Override 15 public void makeRoof() { 16 house.setRoof("別墅->屋頂"); 17 } 18 19 @Override 20 public House getHouse() { 21 return house; 22 } 23 }客戶端只需把施工隊(duì)換成別墅施工隊(duì)
public class MainClass {public static void main(String[] args) {//施工隊(duì)造房子HouseBuilder bieshuBuilder = new BieshuBuilder();//只需要修改這里 HouseDirector houseDirector = new HouseDirector();houseDirector.make(bieshuBuilder);House house = bieshuBuilder.getHouse();System.out.println(house.getFloor());System.out.println(house.getWall());System.out.println(house.getRoof());} }? 適用范圍
1、對象的創(chuàng)建:Builder模式是為對象的創(chuàng)建而設(shè)計(jì)的模式
2、創(chuàng)建的是一個復(fù)合對象:被創(chuàng)建的對象為一個具有復(fù)合屬性的復(fù)合對象
3、關(guān)注對象創(chuàng)建的各部分的創(chuàng)建過程:不同的工廠(這里指builder生成器)對產(chǎn)品屬性有不同的創(chuàng)建方法
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/Renyi-Fan/p/10993594.html
總結(jié)
以上是生活随笔為你收集整理的北风设计模式课程---7、建造者模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle-ORA-01555错误
- 下一篇: shell对文本进行操作命令