java设计模式建造_java设计模式-建造者模式
建造者模式:將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)造不同的表示。
建造者模式將一個(gè)產(chǎn)品的內(nèi)部表象和產(chǎn)品的生成過(guò)程分割開(kāi)來(lái),建造對(duì)象的時(shí)候只需要指定需要建造的類型,而不必了解具體的建造過(guò)程。
一個(gè)玩具工廠,工人們建造新的玩具人時(shí),需要逐個(gè)安裝各個(gè)部分,種類有胖虎和小夫。萬(wàn)一粗心大意忘記裝了某個(gè)部分,就出現(xiàn)了不合格的玩具,缺胳膊少腿。
為了減少次品率,老板引入了一臺(tái)機(jī)器,設(shè)定好程序后,工人只要選擇制造的玩具種類,按下開(kāi)關(guān)之后機(jī)器自動(dòng)就去裝配對(duì)應(yīng)的玩具。
代碼結(jié)構(gòu)圖如下:
用代碼來(lái)表示就是====>>
首先是一個(gè)建造人物的接口(機(jī)器類,作為一個(gè)制造者,對(duì)玩具而言是個(gè)上帝般的角色,展示了裝配一個(gè)玩具的各個(gè)過(guò)程):
package com.hy.bulider;
public class God {
private IPerson person;
public God(IPerson person) {
this.person = person;
}
public void createPerson() {
person.buildHead();
person.buildBody();
person.buildArms();
person.buildHands();
person.buildLegs();
person.buildFoots();
System.out.println("合成了一個(gè)"+person);
}
}
然后是玩具的接口類和兩個(gè)具體的玩具實(shí)現(xiàn)類(機(jī)器程序設(shè)定的程序,規(guī)定了作為一個(gè)玩具必須要有的零件):
package com.hy.bulider;
public interface IPerson {
public void buildHead();
public void buildBody();
public void buildArms();
public void buildHands();
public void buildLegs();
public void buildFoots();
public String toString();
}
package com.hy.bulider;
public class Fatter implements IPerson{
public void buildHead() {
System.out.println("組成胖頭部");
}
public void buildBody() {
System.out.println("組成胖身體");
}
public void buildArms() {
System.out.println("組成胖胳膊");
}
public void buildHands() {
System.out.println("組成胖手");
}
public void buildLegs() {
System.out.println("組成胖腿");
}
public void buildFoots() {
System.out.println("組成胖腳");
}
@Override
public String toString() {
return "胖虎";
}
}
package com.hy.bulider;
public class Thinner implements IPerson{
public void buildHead() {
System.out.println("組成瘦頭部");
}
public void buildBody() {
System.out.println("組成瘦身體");
}
public void buildArms() {
System.out.println("組成瘦胳膊");
}
public void buildHands() {
System.out.println("組成瘦手");
}
public void buildLegs() {
System.out.println("組成瘦腿");
}
public void buildFoots() {
System.out.println("組成瘦腳");
}
public String toString() {
return "小夫";
}
}
最后是測(cè)試類:
package com.hy.bulider;
public class Test {
public static void main(String[] args) {
Thinner thinner = new Thinner();
God god = new God(thinner);
god.createPerson();
Fatter fatter = new Fatter();
god = new God(fatter);
god.createPerson();
}
}
這樣工人工作的時(shí)候只需要選擇特定的模型,然后運(yùn)行機(jī)器就可以得到合格的玩具,而且不必關(guān)心裝配玩具的具體細(xì)節(jié)。即使后面新增了大雄靜香等需求訂單,只需要在機(jī)器中設(shè)定裝配程序就可以正常工作。
另外,如果有更多的細(xì)節(jié)的實(shí)現(xiàn),比如臉部的眼睛鼻子等等,則需要綜合權(quán)衡接口類中的構(gòu)造方法是否足夠普遍,別的具體構(gòu)造者實(shí)現(xiàn)是否需要這些方法。
建造者模式的結(jié)構(gòu)圖如下:
Bulider是為創(chuàng)建一個(gè)Product對(duì)象的各個(gè)部件指定的抽象接口。
ConcreteBuilder是具體的建造者,實(shí)現(xiàn)Builder接口構(gòu)造和裝配各個(gè)部件。
Product指具體的角色。
Director指揮者,構(gòu)建正在使用Builder接口的對(duì)象。
建造者模式主要應(yīng)用的場(chǎng)景:創(chuàng)建一些復(fù)雜的對(duì)象,這些對(duì)象內(nèi)部構(gòu)建間的建造順序是穩(wěn)定的,但對(duì)象內(nèi)部的構(gòu)建通常面臨著復(fù)雜的變化。即:當(dāng)創(chuàng)建復(fù)雜對(duì)象的算法應(yīng)該獨(dú)立于該對(duì)象的組成部分以及他們的裝配方法時(shí)適用建造者模式。
建造者模式好處:
1、最主要的好處是,使得對(duì)象的構(gòu)建與表示分離,可以讓表示獨(dú)立于過(guò)程而獨(dú)立的變化,并且客戶端不再需要關(guān)心具體的構(gòu)建過(guò)程和表示。
2、由于固定的表示由具體的制造者提供,所以要重復(fù)制造幾個(gè)表示相同的對(duì)象的時(shí)候,只需要讓指揮者控制制造者再進(jìn)行一次即可。
模板方法模式,遇到一系列步驟構(gòu)成的過(guò)程需要執(zhí)行,這個(gè)過(guò)程從高層次上看是相同的,這時(shí)把不變行為搬移到父類(超類),提供了一個(gè)代碼復(fù)用的平臺(tái),去除了類中的重復(fù)代碼來(lái)體現(xiàn)它的優(yōu)勢(shì)。也就是說(shuō),當(dāng)不變和可變的行為在方法的子類實(shí)現(xiàn)中混合在一起的時(shí)候,把這些行為搬移到單一的地方(父類/超類),幫助子類擺脫重復(fù)的不變行為的糾纏。
建造者模式的對(duì)象構(gòu)建過(guò)程和這個(gè)有些類似,對(duì)象的接口類中定義了對(duì)象普遍的構(gòu)造方法,具體的對(duì)象構(gòu)造者建造過(guò)程和細(xì)節(jié)。不同的地方在于建造者模式中對(duì)象的接口類只定義對(duì)象普遍的構(gòu)造方法,在建造類中定義了對(duì)象的構(gòu)造流程。若是沒(méi)有構(gòu)造者類,建造者模式可以看作一個(gè)模板方法模式。
模板方法模式是行為型模式,不僅描述對(duì)象或類的模式,還描述它們之間的通信方式,實(shí)現(xiàn)過(guò)程中采用繼承機(jī)制在類間分派行為。建造者模式是創(chuàng)建型模式,抽象了實(shí)例化過(guò)程。在實(shí)現(xiàn)方法的骨架層次上,建造者模式中使用的是組合的方式。所以建造者更靈活,而且也可以避免由繼承而引發(fā)的各種問(wèn)題。
總結(jié)
以上是生活随笔為你收集整理的java设计模式建造_java设计模式-建造者模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java树形菜单_Java构建树形菜单
- 下一篇: java heap space flex