圖解設(shè)計(jì)模式之Builder模式

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圖

Builder

對(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)

  1. 封裝性
    使用Builder模式,用戶可以不需要知道產(chǎn)品內(nèi)部的細(xì)節(jié),做到了解耦。
  2. 利于系統(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類。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容