設計模式筆記之五 (建造者模式)


建造者模式

建造者模式的核心思想是將一個"復雜對象的構建算法"與它的"部件及組裝方式"分離,使得構件算法和組裝方式可以獨立應對變化;復用同樣的構建算法可以創建不同的表示,不同的構建過程可以復用相同的部件組裝方式。


好吧,我承認上面那句話是Baidu來的,要是能很容易的明白講的是什么,請切換到漫游模式繼續漫游吧。
下面我們不聊這些模式了,繼續聊我們的實驗室,因為模式不發給我們工資,實驗室才是發工資的。
最近我們的實驗室又遇到麻煩了,老總們即使能夠同時使用女秘書了也忍不住發火了,因為趕太陽國一大筆獸人訂單,到交付的時候才發現,大都數獸人沒有頭,沒有頭的獸人能叫獸人嗎?那只能叫無頭獸!

class ShouRen {
    private String head;
    private String body;
    private String foot;

    public void setHead(String head) {
        this.head = head;
    }
    public void setBody(String body) {
        this.body = body;
    }
    public void setFoot(String foot) {
        this.foot = foot;
    }
}

public class Builder {
    public static void main(String[] args) {
        ShouRen sr = new ShouRen();
        sr.setBody("獸身");
        sr.setFoot("獸腳");
    }
}

為了解決這種浪費材料的問題再次發生,我們實驗室又開了大會,某位管理層說這是因為獸人分廠建設在太陽國的原因,當地的土著完全不理解我們獸人工廠生產獸人時的步驟,所以才會有這個問題,所以要加大獸人員工的培訓,讓他們的技能和我們人類工廠的員工達到一致水平。老總們一聽,立即暴怒,不說培訓獸人員工的費用問題(其實就是我們coding時了解其他類的接口花費的時間),就獸人的智商,即使培訓了也不一定有效果(coding時面對一個上千行的類,實在是提不起興致過一遍 -_-! )。

這時有是我們的資深顧問說,既然這樣,我們就不要讓員工自己創建獸人了,我們給他們發一個獸人創建器,他們只要把原料放到創建器里面自動就出來一個獸人好了。

class ShouRen {
    private String head;
    private String body;
    private String foot;

    public void setHead(String head) {
        this.head = head;
    }
    public void setBody(String body) {
        this.body = body;
    }
    public void setFoot(String foot) {
        this.foot = foot;
    }
}

class ShouRenBuilder {
    ShouRen sr;
    
    public ShouRenBuilder (){
        sr = new ShouRen();
    }
    public void createHead() {
        sr.setHead("獸頭");
    }
    public void createBody() {
        sr.setBody("獸身");
    }
    public void createFoot() {
        sr.setFoot("獸腳");
    }
    public ShouRen createShouRen() {
        createHead();
        createBody();
        createFoot();
        return sr;
    }
}

public class Builder {
    public static void main(String[] args) {
        ShouRen sr = new ShouRenBuilder().createShouRen();
    }
}

老總一看這個方法不錯,大肆贊賞,並且希望擴大使用范圍,希望我們的正常人工廠和人妖工廠也使用這種構造器。

class Ren {

}

class NanRen extends Ren {

    private String head;
    private String body;
    private String foot;

    public void setHead(String head) {
        this.head = head;
    }

    public void setBody(String body) {
        this.body = body;
    }

    public void setFoot(String foot) {
        this.foot = foot;
    }

}

class NvRen extends Ren {

    private String head;
    private String body;
    private String foot;

    public void setHead(String head) {
        this.head = head;
    }

    public void setBody(String body) {
        this.body = body;
    }

    public void setFoot(String foot) {
        this.foot = foot;
    }

}

class RenYao extends Ren {

    private String head;
    private String body;
    private String foot;

    public void setHead(String head) {
        this.head = head;
    }

    public void setBody(String body) {
        this.body = body;
    }

    public void setFoot(String foot) {
        this.foot = foot;
    }

}

class ShouRen extends Ren {

    private String head;
    private String body;
    private String foot;

    public void setHead(String head) {
        this.head = head;
    }

    public void setBody(String body) {
        this.body = body;
    }

    public void setFoot(String foot) {
        this.foot = foot;
    }

}

class NanRenBuilder {
    NanRen nr;
    
    public NanRenBuilder (){
        nr = new NanRen();
    }
    public void createHead() {
        nr.setHead("男人頭");
    }
    public void createBody() {
        nr.setBody("男人身");
    }
    public void createFoot() {
        nr.setFoot("男人腳");
    }
    public NanRen createNanRen() {
        createHead();
        createBody();
        createFoot();
        return nr;
    }
}

class NvRenBuilder {
    NvRen nr;
    
    public NvRenBuilder (){
        nr = new NvRen();
    }
    public void createHead() {
        nr.setHead("女人頭");
    }
    public void createBody() {
        nr.setBody("女人身");
    }
    public void createFoot() {
        nr.setFoot("女人腳");
    }
    public NvRen createNvRen() {
        createHead();
        createBody();
        createFoot();
        return nr;
    }
}
class RenYaoBuilder {
    RenYao ry;
    
    public RenYaoBuilder (){
        ry = new RenYao();
    }
    public void createHead() {
        ry.setHead("人妖頭");
    }
    public void createBody() {
        ry.setBody("人妖身");
    }
    public void createFoot() {
        ry.setFoot("人妖腳");
    }
    public RenYao createRenYao() {
        createHead();
        createBody();
        createFoot();
        return ry;
    }
}
class ShouRenBuilder {
    ShouRen sr;
    
    public ShouRenBuilder (){
        sr = new ShouRen();
    }
    public void createHead() {
        sr.setHead("獸頭");
    }
    public void createBody() {
        sr.setBody("獸身");
    }
    public void createFoot() {
        sr.setFoot("獸腳");
    }
    public ShouRen createShouRen() {
        createHead();
        createBody();
        createFoot();
        return sr;
    }
}

這時財務科的人發表意見了,如果我們的各大工廠都使用構造器的話,確實能省下不少工人的培訓費用,但是硬件成本會加大不少阿(即重復代碼),並且提出,我們的生產流程是一樣的,都是先創建頭,再創建身體,最后創建腳。

所以我們把組裝的工作弄出一個組裝器,然后要生產不同的人的時候仿佛不同的構造器,那么我們原先放在構造器中的組裝步驟就能夠重用了。於是我們就不知不覺的用上了建造者模式來生產。

class Ren {

}

class NanRen extends Ren {

    private String head;
    private String body;
    private String foot;

    public void setHead(String head) {
        this.head = head;
    }

    public void setBody(String body) {
        this.body = body;
    }

    public void setFoot(String foot) {
        this.foot = foot;
    }

}

class NvRen extends Ren {

    private String head;
    private String body;
    private String foot;

    public void setHead(String head) {
        this.head = head;
    }

    public void setBody(String body) {
        this.body = body;
    }

    public void setFoot(String foot) {
        this.foot = foot;
    }

}

class RenYao extends Ren {

    private String head;
    private String body;
    private String foot;

    public void setHead(String head) {
        this.head = head;
    }

    public void setBody(String body) {
        this.body = body;
    }

    public void setFoot(String foot) {
        this.foot = foot;
    }

}

class ShouRen extends Ren {

    private String head;
    private String body;
    private String foot;

    public void setHead(String head) {
        this.head = head;
    }

    public void setBody(String body) {
        this.body = body;
    }

    public void setFoot(String foot) {
        this.foot = foot;
    }

}

interface RenBuilder {
    public abstract void createHead();
    public abstract void createBody();
    public abstract void createFoot();
    public abstract Ren getRen();
}

class NanRenBuilder implements RenBuilder{
    NanRen nr;
    
    public NanRenBuilder (){
        nr = new NanRen();
    }
    public void createHead() {
        nr.setHead("男人頭");
    }
    public void createBody() {
        nr.setBody("男人身");
    }
    public void createFoot() {
        nr.setFoot("男人腳");
    }
    public Ren getRen() {
        return nr;
    }
}

class NvRenBuilder implements RenBuilder{
    NvRen nr;
    
    public NvRenBuilder (){
        nr = new NvRen();
    }
    public void createHead() {
        nr.setHead("女人頭");
    }
    public void createBody() {
        nr.setBody("女人身");
    }
    public void createFoot() {
        nr.setFoot("女人腳");
    }
    public Ren getRen() {
        return nr;
    }
}
class RenYaoBuilder implements RenBuilder{
    RenYao ry;
    
    public RenYaoBuilder (){
        ry = new RenYao();
    }
    public void createHead() {
        ry.setHead("人妖頭");
    }
    public void createBody() {
        ry.setBody("人妖身");
    }
    public void createFoot() {
        ry.setFoot("人妖腳");
    }
    public Ren getRen() {
        return ry;
    }
}
class ShouRenBuilder implements RenBuilder{
    ShouRen sr;
    
    public ShouRenBuilder (){
        sr = new ShouRen();
    }
    public void createHead() {
        sr.setHead("獸頭");
    }
    public void createBody() {
        sr.setBody("獸身");
    }
    public void createFoot() {
        sr.setFoot("獸腳");
    }
    public Ren getRen() {
        return sr;
    }
}

class RenDirector{
    public Ren create(RenBuilder builder) {
        builder.createHead();
        builder.createBody();
        builder.createFoot();
        return builder.getRen();
    }
}

public class Builder {
    public static void main(String[] args) {
        
        ShouRenBuilder srBuilder = new ShouRenBuilder();//獸人建造核心
        NanRenBuilder nanrBuilder = new NanRenBuilder();//男人建造核心
        NvRenBuilder nvrBuilder = new NvRenBuilder();//女人建造核心
        RenYaoBuilder ryBuilder = new RenYaoBuilder();//人妖建造核心
        
        RenDirector rd = new RenDirector();//只有一個組裝器,裝上不同的建造核心,就能建出不同的人。
        Ren sr = rd.create(srBuilder);
        Ren nanren = rd.create(nanrBuilder);
        Ren nvren = rd.create(nvrBuilder);
        Ren ry = rd.create(ryBuilder);
        
    }
}

至此,創建型的五種設計模式就舉例完了。后面的坑慢慢填。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM