前言:
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());
}
}
建造者設計模式其實就是把建立複雜對象的過程一步一步抽取出來,封裝到外面的類中。