設計模式之建造者模式

將一個複雜的對象創建與它的表示分離,是的同樣的構建過程可以創建不同的表示。

 

通用類圖如下:

 



 

建造模式中主要有如下四個角色:

Prodct產品類:

產品便是建造中的複雜對象

 

抽象建造者:

給出一個或多個抽象接口,規範產品的組件,有子類實現具體組建方法

 

具體建造者:

通常是實現了抽象建造者的方法,並且返回一個組建好的對象

 

Director導演類:

負責安排已有的模塊順序,然後告訴建造者開始建造

 

/**
 *
 * 產品類
 *
 */
public class Product {

}

 

/**
 * 抽象建造者
 */
public abstract class AbstractBuilder {

    // 規範組建邏輯
    protected abstract void bulidPart();

    // 返回建造好的產品
    protected abstract Product createProduct();

}

 

/**
 * 具體的建造者
 * 
 */
public class ConcreteBuilder extends AbstractBuilder {

    /**
     * 
     * @see com.huashao.chapter.chapter11.AbstractBuilder#bulidPart()
     */
    @Override
    protected void bulidPart() {
        // TODO Auto-generated method stub

    }

    /**
     * @return
     * @see com.huashao.chapter.chapter11.AbstractBuilder#createProduct()
     */
    @Override
    protected Product createProduct() {
        // TODO Auto-generated method stub
        return new Product();
    }

}

 

/**
 * 
 * 導演類
 * 
 */
public class Director {

    private AbstractBuilder builder = new ConcreteBuilder();

    public Product buildProduct() {

        builder.bulidPart();

        return builder.createProduct();
    }
}

 

 

建造者模式的使用場景:

1.相同的方法不同的執行順序,產生不同的結果是可以使用建造者模式

2.多個部件或零件,都可以組裝到一個對象中,但是產生的運行結果不相同

2.產品類非常複雜或者產品類中的調用順序不同產生了不同的效果

 

建造者模式的應用:

小明留級了N年後終於考上大學了,小明報考了計算機專業,因爲這個專業可以打Dota,小明跟爸爸說,計算機專業沒有電腦不行(多麼合理的理由啊保密),小明爸爸就給了小明5000塊錢,小明拿着錢去電子城轉了一圈發現如果買現成的電腦都在5000元以上,小明跟爸爸說現在5000塊錢買不了電腦,小明爸爸說:滾!這下可把小明愁壞了,舍友看到小明在唉聲嘆氣就問發生什麼事,小明就把情況更舍友說了一下,舍友說:你可以組裝一臺電腦啊,我這就要去電子城組裝電腦,一起去吧。小明和舍友想電子城飛奔而去........下面上類圖

 




 
 

電腦主要評價指標:CPU,硬盤、顯示器、內存

 

 

/**
 * 
 * 電腦
 * 
 */
public class Computer {

    private String cpu;

    // 硬盤
    private String disk;

    // 內存
    private String memory;

    // 顯示器
    private String display;
    
    

    public Computer() {
    }

    /**
     * @param cpu
     * @param disk
     * @param memory
     * @param display
     */
    public Computer(String cpu, String disk, String memory, String display) {
        this.cpu = cpu;
        this.disk = disk;
        this.memory = memory;
        this.display = display;
    }

    public String getCpu() {
        return cpu;
    }

    public void setCpu(String cpu) {
        this.cpu = cpu;
    }

    public String getDisk() {
        return disk;
    }

    public void setDisk(String disk) {
        this.disk = disk;
    }

    public String getMemory() {
        return memory;
    }

    public void setMemory(String memory) {
        this.memory = memory;
    }

    public String getDisplay() {
        return display;
    }

    public void setDisplay(String display) {
        this.display = display;
    }

}

 

/**
 * 組裝電腦的抽象類
 * 
 */
public abstract class BuliderPC {

    protected Computer computer;
    // 選擇CPU的品牌
    protected abstract void bulidCpu(String cpu);

    // 組裝顯示器,輸入顯示器的品牌
    protected abstract void bulidDisplay(String display);

    // 組裝內存條
    protected abstract void bulidMemory(String memory);

    // 組裝硬盤
    protected abstract void bulidDisk(String disk);

    // 組裝電腦
    protected abstract Computer bulidComputer();
}

 

/**
 * 
 * 
 */
public class ConcreteBulidPc extends BuliderPC {

    public ConcreteBulidPc() {
        computer = new Computer();
    }

    /**
     * @param cpu
     */
    @Override
    protected void bulidCpu(String cpu) {

        computer.setCpu(cpu);
    }

    /**
     * @param display
     */
    @Override
    protected void bulidDisplay(String display) {

        computer.setDisplay(display);
    }

    /**
     * @param memory
     */
    @Override
    protected void bulidMemory(String memory) {

        computer.setMemory(memory);
    }

    /**
     * @param disk
     */
    @Override
    protected void bulidDisk(String disk) {

        computer.setDisk(disk);
    }

    /**
     * @return
     */
    @Override
    protected Computer bulidComputer() {
        // TODO Auto-generated method stub
        return computer;
    }

}

 

/**
 * 
 * 導演類
 * 
 */
public class Director {

    private BuliderPC bulider;

    public Director() {
        bulider = new ConcreteBulidPc();
    }

    public Computer bulidComputer(String cpu, String disk, String memory, String display) {

        bulider.bulidCpu(cpu);
        bulider.bulidDisk(disk);
        bulider.bulidMemory(memory);
        bulider.bulidDisplay(display);

        return bulider.bulidComputer();
    }

}

 

小明和舍友到達電子城,小明跟組裝電腦的老闆說:老闆給你5000塊錢給我組裝個蘋果電腦....老闆說:你是小明吧?我從小就看你的笑話....

 

public class Client {

    public static void main(String[] args) {
       
        Director director=new Director();
        
      Computer xiaoming=director.bulidComputer("Apple", "xxx", "xxx", "apple retina");
      
      Computer sheyou=director.bulidComputer("sony", "xxxx", "xxx", "samsung");
      
    }
}

 

其實組裝電腦這件事用建造者感覺有點不合適,因爲我們完全可以new一個電腦然後挨個賦值吐舌頭

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章