1. 程式人生 > >設計模式(Java隨筆)—生成器模式

設計模式(Java隨筆)—生成器模式

生成器模式(Builder Pattern):分離構建演算法和具體的構造實現,從而使構建演算法可以重用

 Separate the construction of a complex object from its representation so that the same construction process can create different representations.

    將一個複雜物件的構建與它的表示分離,使同樣的構建過程可以建立不同的表示。

生成器模式將物件的構造過程封裝在具體的生成器中,使用者使用不同的具體生成器就可以得到該物件的不同表示。

當增加新的具體的生成器是,不必修改指揮者的程式碼,即該模式滿足開-閉原則。

角色:

  • 產品類(Product)——實類,指定產品的結構或生產步驟
  • 抽象生成器(Abstract Builder)——抽象類,定義子類在完成具體產品結構時必須要實現的方法
  • 具體生成器(Concreat Builder)——實類,具體一種產品的實現
  • 指導類(Director)——與使用者直接互動的類,通過此類可以生產出不同的產品

列子:感冒藥都應該具有配方,但不同藥品的配方的組成成分又不相同。藥品生產的結構就滿足生成器模式

import java.util.ArrayList;
import java.util.List;

public class BuilderModel {
	/**
	 * 創造者模式(生成器模式)
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		DrugDirector director=new DrugDirector();
		DrugBuilder builder;
		builder=new Builder999();
		director.construct(builder);
		builder=new BuilderGanKang();
		director.construct(builder);
	}
}

// 藥品配方類
class Drug {
	private String drugName;

	public Drug(String drugName) {
		this.drugName = drugName;
	}
	///輸出藥物名字
	public String getDrugName() {
		return drugName;
	}

	private List<String> list = new ArrayList<String>();
	//添加藥物成分
	public void addSub(String dSub) {
		list.add(dSub);
	}
	//輸出藥物成分
	public String getSub() {
		String temp ="";
		for(String s:list){
			temp+=(s+" ");
		}
		return temp;
	}
}

//藥品生成器介面
interface DrugBuilder{
	//定義子類必須實現的兩個方法(添加藥物成分和顯示藥物成分)
	public void builderSub();
	public void showDrug();
}

//藥品1
class Builder999 implements DrugBuilder{
	Drug drug=new Drug("999感冒靈");

	@Override
	public void builderSub() {
		drug.addSub("麻黃");
		drug.addSub("葛根");
		drug.addSub("桂枝");
		drug.addSub("糊精");
		drug.addSub("苦杏仁");
		drug.addSub("陳皮");
	}

	@Override
	public void showDrug() {
		System.out.println("藥品名稱:"+drug.getDrugName());
		System.out.println("組成成分:"+drug.getSub());
	}
}

//藥品2
class BuilderGanKang implements DrugBuilder{
	Drug drug=new Drug("感康");
	@Override
	public void builderSub() {
		drug.addSub("對乙醯氨基酚");
		drug.addSub("鹽酸金剛烷胺");
		drug.addSub("咖啡因");
		drug.addSub("人工牛黃");
		drug.addSub("馬來酸氯苯那敏");
	}

	@Override
	public void showDrug() {
		System.out.println("藥品名稱:"+drug.getDrugName());
		System.out.println("組成成分:"+drug.getSub());
	}
}

//指揮類(制定藥品的種類)
class DrugDirector{
	//在這裡指揮類的作用只是顯示藥品資訊,需要傳入藥品物件表明是何種藥品的資訊
	public void construct(DrugBuilder builder){
		builder.builderSub();
		builder.showDrug();
	}
}

程式輸出:

藥品名稱:999感冒靈
組成成分:麻黃 葛根 桂枝 糊精 苦杏仁 陳皮 
藥品名稱:感康
組成成分:對乙醯氨基酚 鹽酸金剛烷胺 咖啡因 人工牛黃 馬來酸氯苯那敏 

參考書籍:《大話設計模式》,《設計模式(Java版)》