?**英文名稱**: Builder Pattern又叫做生成器模式
**定義**:將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。
## 建造者的一般模式

Product產品類:實現了模板方法模式,也就是有模板方法和基本方法。
Builder類抽象建造者,規范產品的組件,一般是由子類實現 ConcreteBuilder具體建造者,實現抽象類類定義的 所有方法,并返回一個組建好的對象。
Directoer 導演類負責安排已有的模塊的順序,然后告訴Builder開始建造。
該例子只是為了說明 建造者模式的一般模式,并沒有實際的開發場景,因此,在實際項目開發環境中,應該靈活應用建造者模式。
~~~
public class BuilderPattern {
public static void main(String[] args) {
MyDirector director = new MyDirector();
Product p = director.getProduct();
p.mothod();
}
}
class Product {
//該類可以引入模板模式,也可以為普通的類。
protected void mothod(){
System.out.println("我是產品類中的方法....");
}
}
abstract class ProductBuilder{
//該類為抽象的建造者類。具體實現方法是由子類來完成的。
public abstract Product getProduct();
}
class AProductBuilder extends ProductBuilder{
//該類是建造者抽像類的具體實現類。創建出需要的實例。
private Product p = new Product();
@Override
public Product getProduct() {
// TODO Auto-generated method stub
return this.p;
}
}
class MyDirector{
//該類是指揮者類,主要用與高速創建者類需要創建的對象。
private AProductBuilder apBuilder = new AProductBuilder();
public Product getProduct(){
return this.apBuilder.getProduct();
}
}
~~~
**一個例子**:
建造一個生產汽車的模板,具有start(),stop(),alarm(),engineBoom(),run()等方法。
但是現在的需求是,根據用戶的要求來生產不同類型的車模。例如,寶馬車的模型,按照用戶的需求來啟動寶馬車。

~~~
public class BuilderTest {
public static void main(String[] args) {
//使用指揮者,直接構建模板類型的實例
Director director = new Director();
//獲取奔馳車實例
BenzModel benz = (BenzModel) director.getA_BenzCarModel();
benz.run();
}
}
class Director{
private ArrayList<String> sequence = new ArrayList<String>();
private BenzBuilder benzBuilder = new BenzBuilder();
private BMWBuilder bmwBuilder = new BMWBuilder();
/**
* 寶馬車A的模型
* @return 寶馬車的實例
*/
public Model getA_BMWCarModel(){
//先將集合中的數據清空
this.sequence.clear();
//為用戶定義寶馬車的啟動方式
sequence.add("start");
sequence.add("alarm");
sequence.add("stop");
this.bmwBuilder.setSequence(sequence);
return this.bmwBuilder.getModel();
}
/**
* 寶馬車B的模型
* @return 寶馬車B的實例
*/
public Model getB_BMWCarModel(){
//先將集合中的數據清空
this.sequence.clear();
//為用戶定義寶馬車的啟動方式
sequence.add("start");
sequence.add("alarm");
sequence.add("engine boom");
sequence.add("stop");
this.bmwBuilder.setSequence(sequence);
return this.bmwBuilder.getModel();
}
/**
* 奔馳車A的模型
* @return 奔馳車的實例
*/
public Model getA_BenzCarModel(){
//先將集合中的數據清空
this.sequence.clear();
//為用戶定義寶馬車的啟動方式
sequence.add("start");
sequence.add("alarm");
sequence.add("engine boom");
sequence.add("stop");
this.benzBuilder.setSequence(sequence);
return this.benzBuilder.getModel();
}
/**
* 奔馳車B的模型
* @return 奔馳車的實例
*/
public Model getB_BenzCarModel(){
//先將集合中的數據清空
this.sequence.clear();
//為用戶定義寶馬車的啟動方式
sequence.add("start");
sequence.add("alarm");
sequence.add("engine boom");
sequence.add("stop");
this.benzBuilder.setSequence(sequence);
return this.benzBuilder.getModel();
}
}
abstract class Model{
ArrayList<String> sequence = new ArrayList<String>();
//車輛啟動
protected abstract void start();
//車輛停止
protected abstract void stop();
//車輛鳴笛
protected abstract void alarm();
//車輛發動機轟鳴
protected abstract void engineBoom();
protected void run(){
Iterator<String> it = sequence.iterator();
while(it.hasNext()){
String str = it.next();
if(str.equalsIgnoreCase("engine boom")){
this.engineBoom();
}else if(str.equalsIgnoreCase("start")){
this.start();
}else if(str.equalsIgnoreCase("alarm")){
this.alarm();
}else{
this.stop();
}
}
}
protected void setSequence(ArrayList<String> sequence){
this.sequence = sequence;
}
}
class BMWModel extends Model{
@Override
protected void start() {
System.out.println("寶馬車啟動...");
}
@Override
protected void stop() {
System.out.println("寶馬車停止...");
}
@Override
protected void alarm() {
System.out.println("寶馬車開始鳴笛...");
}
@Override
protected void engineBoom() {
System.out.println("寶馬車發動機轟鳴...");
}
}
class BenzModel extends Model{
@Override
protected void start() {
System.out.println("奔馳啟動...");
}
@Override
protected void stop() {
System.out.println("奔馳停止...");
}
@Override
protected void alarm() {
System.out.println("奔馳開始鳴笛...");
}
@Override
protected void engineBoom() {
System.out.println("奔馳發動機轟鳴...");
}
}
abstract class CarBuilder{
//用戶自定義車輛啟動方式
protected abstract void setSequence(ArrayList<String> sequence);
//返回Model類及其子類的實例
protected abstract Model getModel();
}
class BenzBuilder extends CarBuilder{
private Model benz = new BenzModel();
@Override
protected void setSequence(ArrayList<String> sequence) {
this.benz.setSequence(sequence);
}
@Override
protected Model getModel() {
// TODO Auto-generated method stub
return this.benz;
}
}
class BMWBuilder extends CarBuilder{
private Model bmw = new BMWModel();
@Override
protected void setSequence(ArrayList<String> sequence) {
// TODO Auto-generated method stub
this.bmw.setSequence(sequence);
}
@Override
protected Model getModel() {
// TODO Auto-generated method stub
return this.bmw;
}
}
~~~
**Tip:(開發中的小習慣)**
1、this調用當調用本類中的成員變量或方法時,要使用this關鍵字,以區分本方法中的一個變量
2、super調用,當調用父類的成員變量和方法時,使用super關鍵字
3、當ArrayList和HashMap如果定義成類的成員變量,那在方法中的調用一定要做一個clear的動作,以防止數據混亂
## 建造者模式使用場景
1、相同的方法,不同的執行順序,產生不同的事件結果時,可以采用建造者模式
2、多個部件和零件,都可以裝配到一個對象中,到那時產生的運行結果又不相同時,這可以使用該模式
3、產品類十分復雜,或者產品類中的調用順序不同產生了不同的效能,使用建造者模式
- 前言
- 6大設計原則(一)---單一職責原則
- 6大設計原則(二)---里氏替換原則
- 6大設計原則(三)---依賴倒置原則
- 6大設計模式(四)----接口隔離原則
- 6大設計原則(五)---迪米特法則
- 6大設計原則(六)---開閉原則。
- 設計模式(一)---單例模式
- 設計模式(二)---工廠方法模式
- 設計模式(三)---抽象工廠模式
- 設計模式(四)---模板方法模式
- 設計模式(五)---建造者模式
- 設計模式(六)---代理模式
- 設計模式(七)---原型模式
- 設計模式(八)---中介者模式
- 設計模式(九)---命令模式
- 設計模式(十)---責任鏈模式
- 設計模式(十一)---裝飾模式
- 設計模式(十二)---策略模式
- 設計模式(十三)---適配器模式
- 設計模式(十四)---迭代器模式
- 設計模式(十五)---組合模式
- 設計模式(十六)---觀察者模式
- 設計模式(十七)---門面模式
- 設計模式(十八)---備忘錄模式
- 設計模式(十八)---訪問者模式
- 設計模式(二十)---狀態模式
- 設計模式(二十二)---享元模式
- 設計模式(二十三)---橋梁模式