該系列文章為部落客學習筆記,原文請參考參考連結
本文禁止轉載,但是歡迎大家留言區留言交流[微笑]
建造者模式是一種對象建立模型,比如需要建立兩個交通工具類,分别是汽車和機車類,兩個對象的結構都一緻(屬性:名稱、類型、車身顔色、車齡等等)。可能有的人會想,我建立一個Card類,然後建立兩個類分别是汽車類和機車類,然後分别繼承Card類,并重寫get和set方法等等。
如果按照上述做法不是很好,因為設計的時候應該多關聯少繼承,這樣會不利于程式的擴充。其次我們不想讓用戶端知道建立一個汽車類或者機車類都需要什麼方法,想要對用戶端透明,是以我們應該采用建造者模式。
代碼:
//Card類對應Product類,是一個産品的類
public class Card {
//汽車名稱
private String name;
//汽車類型
private String type;
//使用時間
private int age;
//車蓋顔色
private String color;
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "車名:"+this.name+" 車類型:"+this.type+" 車齡:"+this.age+" 車蓋顔色:"+this.color;
}
}
//具體産品,對應UML圖中的concreteBuilder類
//是CardBuilder的具體實作類,用于生産具體的産品
public class BigCard extends CardBuilder {
@Override
public void buildName() {
card.setName("大運摩托");
}
@Override
public void buildType() {
card.setType("機車");
}
@Override
public void buildAge() {
card.setAge();
}
@Override
public boolean isColor() {
return false;
}
@Override
public void buildColor() {
card.setColor("藍色");
}
}
//具體産品,對應UML圖中的concreteBuilder類
//是CardBuilder的具體實作類,用于生産具體的産品
public class SmallCard extends CardBuilder {
@Override
public void buildName() {
card.setName("三菱");
}
@Override
public void buildType() {
card.setType("貨車");
}
@Override
public void buildAge() {
card.setAge();
}
@Override
public void buildColor() {
card.setColor("紅色");
}
}
//CardBuilder對應Builder類,對産品(Card)設定的屬性聲明為抽象方法(buildName、buildType等等),然後具體産品類(SmallCard,BigCard)去繼承,并且重寫抽象方法,這裡面儲存了對産品類Card的依賴,在子類中通過card去進行設定,在該類中聲明createCard方法,用于傳回設定完的card對象。這樣在用戶端種就不會知道建構一個對象的細節,将細節的流程都交給抽象類,将具體的流程交給抽象類的子類。
public abstract class CardBuilder {
protected Card card = new Card();
public abstract void buildName();
public abstract void buildType();
public abstract void buildAge();
public abstract void buildColor();
protected boolean isColor() {
return true;
}
public Card createCard() {
return card;
}
}
//對應于UML圖中的Director
//用于傳回具體生産的類
public class CardController {
public Card construct(CardBuilder ab) {
Card card;
ab.buildName();
ab.buildAge();
ab.buildType();
if (ab.isColor()) {
ab.buildColor();
}
card = ab.createCard();
return card;
}
}
public class myClass {
public static void main(String[] args) {
CardController cardController=new CardController();
final Card construct = cardController.construct(new SmallCard());
System.out.println("construct = " + construct.toString());
}
}
輸出:
construct = 車名:三菱 車類型:貨車 車齡:5 車蓋顔色:紅色
這種模式适用于兩個或者兩個以上,對象大緻相同(屬性,方法),而要設定不同屬性,産生不同的對象,在寫日常寫代碼中,我覺得用途還是很大的,之前對于這種操作都是運用的繼承的方式,現在感覺low到爆。
微信公衆号:
QQ群:365473065