天天看點

java設計模式五之Builder建造者設計模式

前言:

     Builder建造者設計模式,用來隐藏複合對象的建立過程,把複合對象的建立過程加以抽象,通過子類繼承或者重載的方式,動态的建立具有複合屬性的對象。

     我感覺比較明顯的一個優點是:把對象建立和業務代碼分離,代碼清晰易懂,便于代碼的維護,不用把複雜的對象建立過程融合到業務邏輯代碼中。

怎麼實作?

   1.有一個複合的對象,稱之為product,最終要建立的産品。

   2.抽象建造者,利用多态的特性,用來接收真實建造者。

   3.真實建造者,用來建立一個具體的複合對象及各個屬性,及傳回對象的方法

   4.設計師,根據建造者,設計出最終産品

代碼:

  建立房子實體類House:

package com.xhx.designpattern.entity;

public class House {
    private String floor;
    private String wall;
    private String housetop;

    public String getFloor() {
        return floor;
    }

    public void setFloor(String floor) {
        this.floor = floor;
    }

    public String getWall() {
        return wall;
    }

    public void setWall(String wall) {
        this.wall = wall;
    }

    public String getHousetop() {
        return housetop;
    }

    public void setHousetop(String housetop) {
        this.housetop = housetop;
    }
}      

如果直接建房子:

//直接造房子
//        House house=new House();
//        house.setFloor("地闆");
//        house.setHousetop("房頂");
//        house.setWall("牆");      

上面這個代碼肯定不是咱們想要的,如果house對象更加複雜,直接寫在業務代碼裡或者是在業務類中抽出一個方法,簡直都不能忍。

建立一個建造房子的接口:

package com.xhx.designpattern;

import com.xhx.designpattern.entity.House;

/**
 * 工程隊
 */
public interface HouseBuilder {

    //修地闆
    public void makeFloor();

    //修牆
    public void makeWall();

    //修屋頂
    public void makeHousetop();

    public House getHouse();
}      

下面建造者 建平房:

package com.xhx.designpattern;

import com.xhx.designpattern.entity.House;

/**
 * 平房工程隊
 */
public class PingFangBuilder implements HouseBuilder{
   House house = new House();

    @Override
    public void makeFloor() {
        house.setFloor("平房-->地闆");
    }

    @Override
    public void makeWall() {
        house.setWall("平房-->牆");
    }

    @Override
    public void makeHousetop() {
        house.setHousetop("平房-->房頂");
    }

    @Override
    public House getHouse() {
        return house;
    }
}      

如果由建造者建房子:

//HouseBuilder builder = new PingFangBuilder();
//        builder.makeFloor();
//        builder.makeHousetop();
//        builder.makeWall();      

這樣也不好,業務邏輯代碼中都是makeXXX,和上面直接建房子(setXXX)沒差別

下面建立一個房子設計師:

package com.xhx.designpattern;

public class HouseDirecter {

    //其實也沒必要加一個屬性,構造函數傳參,
    //makeHourse方法加個入參HouseBuilder 就可以了
    private HouseBuilder builder;

    public HouseDirecter(HouseBuilder builder){
        this.builder=builder;
    }

    public void makeHourse(){
        builder.makeFloor();
        builder.makeWall();
        builder.makeHousetop();
    }
}      

下面由設計師來造房子:

HouseBuilder builder = new PingFangBuilder();
        HouseDirecter directer = new HouseDirecter(builder);
        directer.makeHourse();      

看一下這三種造房子主方法:

package com.xhx.designpattern;

import com.xhx.designpattern.entity.House;

/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args )
    {
        //直接造房子
//        House house=new House();
//        house.setFloor("地闆");
//        house.setHousetop("房頂");
//        house.setWall("牆");

        //由工程對來修
        //HouseBuilder builder = new PingFangBuilder();
        HouseBuilder builder = new GongyuBuilder();
//        builder.makeFloor();
//        builder.makeHousetop();
//        builder.makeWall();


        //由設計者來做
        HouseDirecter directer = new HouseDirecter(builder);
        directer.makeHourse();
        House house = builder.getHouse();

        System.out.println(house.getFloor());
        System.out.println(house.getHousetop());
        System.out.println(house.getWall());
    }
}      

建造者設計模式其實就是把建立複雜對象的過程一步一步抽取出來,封裝到外面的類中。