Builder模式即建造者模式,在這里,我就不使用《圖解設(shè)計(jì)模式》一書中的程序作為示例了,而是換一個(gè)讓人更加清晰易懂的例子。
示例程序
示例程序的內(nèi)容是"造人"
Person 類
// Person 類
public class Person {
private String head;
private String body;
private String hand;
private String foot;
public String getHead(){
return head;
}
public void setHead(String head){
this.head = head;
}
public String getBody(){
return body;
}
public void setBody(String body){
this.body = body;
}
public String getHand() {
return hand;
}
public void setHand(String hand) {
this.hand = hand;
}
public String getFoot() {
return foot;
}
public void setFoot(String foot) {
this.foot = foot;
}
}
Builder接口
// Builder接口
public interface Builder {
void makeHead();
void makeBody();
void makeHand();
void makeFoot();
Person createPerson();
}
SmartPersonBuilder 類
// SmartPersonBuilder
public class SmartPersonBuilder implements Builder {
Person p;
public SmartPersonBuilder(){
p = new Person();
}
@Override
public void makeHead(){
p.setHead("smart head");
}
@Override
public void makeBody(){
p.setBody("normal body");
}
@Override
public void makeHand(){
p.setHand("normal hand");
}
@Override
public void makeFoot(){
p.setFoot("normal foot");
}
@Override
public Person createPerson(){
return p;
}
}
StrongPeronBuilder 類
// StrongPeronBuilder
public class StrongPersonBuilder implements Builder {
Person p;
public StrongPersonBuilder(){
p = new Person();
}
@Override
public void makeHead(){
p.setHead("normal head");
}
@Override
public void makeBody(){
p.setBody("strong body");
}
@Override
public void makeHand(){
p.setHand("normal hand");
}
@Override
public void makeFoot(){
p.setFoot("normal foot");
}
@Override
public Person createPerson(){
return p;
}
}
Director 類
// director
public class Director {
public Person construct(Builder builder){
builder.makeHead();
builder.makeBody();
builder.makeHand();
builder.makeFoot();
return builder.createPerson();
}
}
Main 類
// Main
public class Main {
public static void main(String[] args){
Director director = new Director();
Person p1 = director.construct(new SmartPersonBuilder());
Person p2 = director.construct(new StrongPersonBuilder());
// p1 smart person
System.out.println(p1.getHead());
System.out.println(p1.getBody());
System.out.println(p1.getHand());
System.out.println(p1.getFoot());
// p2 strong person
System.out.println(p2.getHead());
System.out.println(p2.getBody());
System.out.println(p2.getHand());
System.out.println(p2.getFoot());
}
}
Builder模式中的角色
Builder
Builder角色負(fù)責(zé)定義用于生成示例的接口。Builder角色中準(zhǔn)備了用于生成示例的方法;示例程序中,由Builder接口扮演這個(gè)角色。
ConcreteBuilder
ConcreteBuilder即具體的建造者,在本示例中由SmartPersonBuilder和StrongPeronBuilder類扮演了這個(gè)角色。
Director
Director這個(gè)角色的用處用原書的話來說就是:監(jiān)工。Director角色負(fù)責(zé)使用Builder接口來生成具體的實(shí)例。本示例程序中,由Director類扮演這個(gè)角色。
Client
Client為使用者,該角色的作用就是使用Builer模式,示例程序中,由Main類扮演這個(gè)角色。
Builder模式的UML圖

對(duì)于Builder模式的思考
為什么需要Director角色
Builder模式的關(guān)鍵在于,將“要做什么”與“做出來” 分離;將“如何裝配” 與 “完成裝配” 分離。Director知道要做什么,而Builder負(fù)責(zé)做出來這件事。Director是一個(gè)指揮官,Builder負(fù)責(zé)實(shí)施。如果沒有了Director,就需要Client承擔(dān)指揮官這樣一個(gè)角色,這是我們不想看到的,我們需要組裝的過程被隱藏在Director角色中,Client角色只需要調(diào)用Director角色,讓Director指揮Builder完成組裝這件事就好。請(qǐng)用心體會(huì)面向?qū)ο蟮膴W妙之處。
Builder模式有什么優(yōu)點(diǎn)
- 封裝性
使用Builder模式,用戶可以不需要知道產(chǎn)品內(nèi)部的細(xì)節(jié),做到了解耦。 - 利于系統(tǒng)的擴(kuò)展
試想一下我們的示例,除了smart person 和 strong person 以外,如果我還想創(chuàng)建一個(gè)產(chǎn)品類別:pretty person。我們只需要在創(chuàng)建一個(gè)PrettyPersonBuilder類即可,對(duì)于Client使用者來說,是及其友好的。
Builder模式的使用場景
Builder模式用于組裝復(fù)雜的實(shí)例。當(dāng)產(chǎn)品類非常復(fù)雜,或者說產(chǎn)品類中的調(diào)用順序不同就產(chǎn)生不同的效能的時(shí)候,我們就可以使用Builder模式。舉個(gè)例子:比如老板需要工程師組裝汽車,不同種類的汽車的功能不同。我們最好的辦法就是創(chuàng)建不同模式的汽車Builder類。