學(xué)習(xí)筆記:設(shè)計模式之建造者模式

建造房子需求:
過程為打樁、砌墻、封頂三步,房子有各種各樣的,比如普通房,高樓,別墅,各種房子的過程雖然一樣,但是每個房子的要求不一樣。

1.傳統(tǒng)方法

public abstract class AbstractHouse {
    public abstract void buildBase(); //打地基
    public abstract void buildWall(); //砌墻
    public abstract void buildRoof(); //封頂
}

public class House extends AbstractHouse{
    @Override
    public void buildBase() {
        System.out.println("房子要打10米深的地基!");
    }
    @Override
    public void buildWall() {
        System.out.println("房子要砌20厘米厚的墻!");
    }
    @Override
    public void buildRoof() {
        System.out.println("房子要封裝玻璃屋頂!");
    }
    public void build(){ //這里體現(xiàn)了各個步驟之間的順序
        buildBase();
        buildWall();
        buildRoof();
    }
}
通過調(diào)用House類中的build()方法,執(zhí)行結(jié)果為:
房子要打10米深的地基!
房子要砌20厘米厚的墻!
房子要封裝玻璃屋頂!

注:這里只展示了其中一種類型房子的實現(xiàn),其它的實現(xiàn)方式與上述非常相似,故在這里不再贅述。

評價

設(shè)計的程序結(jié)構(gòu),過于簡單,沒有設(shè)計緩存層對象,把房子和創(chuàng)建房子的過程封裝在一起,耦合性增強(qiáng)了,使得程序的擴(kuò)展和維護(hù)性不好。

2.建造者模式

它可以將復(fù)雜對象的建造過程抽象出來,使這個抽象過程的不同實現(xiàn)方法可以構(gòu)造出不同表現(xiàn)(屬性)的對象。它允許用戶只通過指定復(fù)雜對象的類型和內(nèi)容就可以構(gòu)建它們,用戶不需要知道內(nèi)部的具體構(gòu)建細(xì)節(jié)。
建造者模式的四個角色

  1. Product (產(chǎn)品角色): 一個具體的產(chǎn)品對象。
  2. Builder (抽象建造者): 創(chuàng)建一個Product對象的各個部件指定的接口/ 抽象類。
  3. ConcreteBuilder (具體建造者): 實現(xiàn)接口,構(gòu)建和裝配各個部件,并且創(chuàng)建對象。
  4. Director (指揮者): 構(gòu)建一個使用Builder接口的對象。它主要是用于創(chuàng)建一個復(fù)雜的對象。它主要有兩個作用,一是:隔離了客戶與對象的生產(chǎn)過程,二是:負(fù)責(zé)控制產(chǎn)品對象的生產(chǎn)過程(控制執(zhí)行順序)。
Product部分:

創(chuàng)建產(chǎn)品的JavaBean類

public class House{
    private String base;//地基屬性
    private String wall;//墻屬性
    private String roof;//屋頂屬性
    public String getBase() {
        return base;
    }
    public void setBase(String base) {
        this.base = base;
    }
    public String getWall() {
        return wall;
    }
    public void setWall(String wall) {
        this.wall = wall;
    }
    public String getRoof() {
        return roof;
    }
    public void setRoof(String roof) {
        this.roof = roof;
    }
    @Override
    public String toString() {
        return "House [base=" + base + ", wall=" + wall + ", roof=" + roof + "]";
    }
}
Builder部分:

創(chuàng)建生產(chǎn)產(chǎn)品各個過程的抽象方法

public abstract class Builder {
    public abstract void buildBase();//打地基
    public abstract void buildWall();//砌墻
    public abstract void buildRoof();//封頂
    public abstract House createHouse();
}
ConcreteBuilder部分:

繼承并實現(xiàn)Builder中的抽象方法,具體的完成每一步的真正操作(不同的產(chǎn)品就是在這里不同的),并且將產(chǎn)生的結(jié)果封裝到創(chuàng)建的House類型的實例中,并且創(chuàng)造開放方法來返回該實例,使得外部可以獲得該實例。

public class CommonHouseBuilder extends Builder{  //這里的CommonHouseBuilder扮演的就是ConcreteBuilder 
    private House commonHouse = new House();
    @Override
    public void buildBase() {
        System.out.println("普通房屋要打10米深的地基!");
        commonHouse.setBase("10米深的地基");
    }
    @Override
    public void buildWall() {
        System.out.println("普通房屋要砌20厘米厚的墻!");
        commonHouse.setWall("20厘米厚的墻");
    }
    @Override
    public void buildRoof() {
        System.out.println("普通房屋要封裝水泥屋頂!");
        commonHouse.setRoof("水泥屋頂");
    }
    @Override
    public House createHouse() {
        return commonHouse;
    }
}
Director部分:

通過傳入的Builder類型實例來調(diào)用其中的方法,在該類中可以控制產(chǎn)品中不同步驟之間的執(zhí)行順序。

public class Director {
    private Builder builder = null;
    public Director(Builder builder){
        this.builder = builder;
    }
    public House construct(){
        builder.buildBase();
        builder.buildWall();
        builder.buildRoof();
        return builder.createHouse();
    }
}
測試部分:
public class Test {
    public static void main(String[] args){
        Director director = new Director(new CommonHouseBuilder());
        House commonHouse = director.construct();
        System.out.println(commonHouse);
    }
}
輸出結(jié)果:
普通房屋要打10米深的地基!
普通房屋要砌20厘米厚的墻!
普通房屋要封裝水泥屋頂!
House [base=10米深的地基, wall=20厘米厚的墻, roof=水泥屋頂]
建造者模式UML類圖

3.總結(jié)

建造者模式所創(chuàng)建的產(chǎn)品一般具有較多的共同點(diǎn),其組成部分相似, 如果產(chǎn)品之間的差異性很大,則不適合使用建造者模式,因此其使用范圍受到一定的限制。如果產(chǎn)品的內(nèi)部變化復(fù)雜,可能會導(dǎo)致需要定義很多具體建造者類來實現(xiàn)這種變化,導(dǎo)致系統(tǒng)變得很龐大,因此在這種情況下,要考慮是否選擇建造者模式。

抽象工廠模式VS 建造者模式

1.建造者模式一般返回一個組裝完成的產(chǎn)品,而抽象工廠模式返回了一系列的產(chǎn)品。
2.建造者模式更加重視生產(chǎn)產(chǎn)品的流程(順序)。
3.抽象工廠模式更像是大批量生產(chǎn)各個零部件的工廠,建造者模式則是將這些零部件組裝成一個成品。

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

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