定義:
將一個複雜的構建和它的表示相分離,使得同樣的構建過程可以創建不同的表示。
角色:
在一個標準的建造者模式中有這幾個角色:
1、抽象建造者(Builder):爲創建一個產品對象的各個部件指定抽象接口。
2、具體建造者(ConcreteBuilder):實現Builder的接口以構造和裝配該產品的各個部件,定義並明確它所創建的表示,並提供一個檢索產品的接口。
3、設計者或指導者(Director):構造一個使用Builder接口的對象,指導構建過程。
4、產品(Product):表示被構造的複雜對象。ConcreteBuilder創建該產品的內部表示並定義它的裝配過程,包含定義組成部件的類,包括將這些部件裝配成最終產品的接口。
以建造房子爲例說下建造者模式,很多時候建造房子或者房子裝修,消費者首先找的是設計師,設計師將圖紙設計出來後,再去找到相應的工人去施工,工人安裝消費者和設計師的圖紙將房子建造好並交付給消費者。
大致流程圖:
定義出消費者心中的房子,也就是產品,需要建造什麼樣子的房子;
產品(Product):
/**
* 需要建造的房子類
* 首先要描述下房子要建造什麼,建造成什麼樣子
*
* Created by Administrator on 2017/10/8.
*/
public class House {
private String window;
private String floor;
public String getWindow() {
return window;
}
public String getFloor() {
return floor;
}
public void setWindow(String window) {
this.window = window;
}
public void setFloor(String floor) {
this.floor = floor;
}
}
設計師根據房屋消費者的需求設計出相應的圖紙,但是設計師並不進行相應的建造,而是將圖紙給工人指導工人建造房子;
設計者或指導者(Director):
/**
* 指導者
* 對於建造房子而言就相當對設計師
* 設計師將設計好的房屋圖紙給具體的工人進行建造
* Created by Administrator on 2017/10/8.
*/
public class Designer {
public void order(Build build){
//建造地板
build.makeFloor();
//建造窗戶
build.makeWindow();
}
}
根據產品定義出產品對象各個部件的接口,即抽象建造者;
抽象建造者(Builder):
/**
* 建造者角色
* 工人接口,定義了工人所需要進行的各項工作,並不具體負責建造房子
*
*同時房子是具體的工人(農民工)進行建造,需要返回房子的方法
* Created by Administrator on 2017/10/8.
*/
public interface Build {
/**
* 建造窗戶
*/
public void makeWindow();
/**
* 建造地板
*/
public void makeFloor();
/**
* 獲取建造的房子對象
* @return 返回對應的房子對象
*/
public House getHouse();
}
定義對應的接口實現類,也就是具體的房屋建造者–工人,不過工人要按照設計師(指導者)的設計圖紙進行建造;
具體建造者(ConcreteBuilder):
/**
* 房屋的具體建造者
* Created by Administrator on 2017/10/8.
*/
public class WorkBuilder implements Build{
private House house=new House();
@Override
public void makeWindow() {
house.setWindow("建造窗戶完成");
}
@Override
public void makeFloor() {
house.setFloor("建造地板完成");
}
@Override
public House getHouse() {
return house;
}
}
工人將房子建造好後,房屋消費者就可以得到房子了;
/**
* 需求建造房子的消費者
* Created by Administrator on 2017/10/8.
*/
public class Client {
public void main(){
//找到設計師
Designer designer=new Designer();
//設計師將設計好的圖紙交個工人進行施工
WorkBuilder workBuilder=new WorkBuilder();
designer.order(workBuilder);
//工人將房子建好後給消費者
House house = workBuilder.getHouse();
Log.e("TAG",house.getWindow()+house.getFloor());
}
}
以上就是一個標準的建造者模式,在實際項目中,很多的建造者模式的運用都是做了相應的變化的;也用建造房屋爲例,對建造者模式做相應變化並運用。
產品(Product):
/**
* 需要建造的房子類
* 首先要描述下房子要建造什麼,建造成什麼樣子
* Created by Administrator on 2017/10/8.
*/
public class House {
private String window;
private String floor;
public void apply(WorkBulder.HouseParmas parmas){
this.window=parmas.window;
this.floor=parmas.floor;
}
@Override
public String toString() {
return window+floor;
}
}
具體建造者(ConcreteBuilder):
/**
* 具體的房子建造者
* Created by Administrator on 2017/10/8.
*/
public class WorkBulder {
private HouseParmas parmas;
public WorkBulder(){
this.parmas=new HouseParmas();
}
public WorkBulder makeWindow(String window){
parmas.window=window;
return this;
}
public WorkBulder makeFloor(String floor){
parmas.floor= floor;
return this;
}
public House builder(){
House house=new House();
house.apply(parmas);
return house;
}
class HouseParmas{
public String window;
public String floor;
}
}
調用:
WorkBulder workBulder=new WorkBulder();
House builder = workBulder.makeFloor("建造地板").makeWindow("建造窗戶").builder();
Log.e("TAG",builder.toString());
上面就是變化後的建造者模式,和標準的建造模式相比少了 抽象建造者(Builder)和設計者或指導者(Director) 這兩個角色;這種變化後的建造者模式在項目開發中式碰到比較多的,系統的AlertDialog、glide等很多都是採用變化後的建造者模式。