設計模式之建造者模式(6)

建造者模式(複雜對象的組裝與創建)

一:建造者模式概述
建造者又稱爲生成器模式,它是一種較爲複雜,使用頻率也相對較低的創建型模式,建造者爲客戶端返回的不是一個簡單的產品,而是一個由多個部件組成的複雜的產品!

那麼什麼是複雜(產品)對象? 簡單來說, 複雜(產品)對象是指那
些包含多個成員屬性的對象, 這些成員屬性也稱爲部件或零件, 如汽車包括方向盤、 發動
機、 輪胎等部件, 電子郵件包括發件人、 收件人、 主題、 內容、 附件等部件

二:建造者模式包含的角色
2.1 複雜產品角色:它是被構建的複雜對象, 包含多個組成部件(我的理解是一個複雜的javaBean)
2.2 抽象建造者角色:
             它既可以是抽象類也可以是接口,在該接口中一般聲明兩種方法,一類方法buildPartXXX(),它們用於創建複雜對象的
             各個部件,另一類方法是getResult, 它們用於返回複雜對象
2.3 具體建造者角色:它實現了Builder接口, 實現各個部件的具體構造和裝配方法
2.4 指揮者角色:它負責安排複雜對象的建造次序, 指揮者與抽象建造者之間存在關聯關係,
 

三:案例
作爲RPG遊戲的一個重要組成部分, 需要對遊戲角色進行設計, 而且隨着該遊戲的升級將不
斷增加新的角色。 不同類型的遊戲角色, 其性別、 臉型、 服裝、 髮型等外部特性都有所差
異, 例如“天使”擁有美麗的面容和披肩的長髮, 並身穿一襲白裙; 而“惡魔”極其醜陋, 留着光
頭並穿一件刺眼的黑衣。 Sunny公司決定開發一個小工具來創建遊戲角色, 可以創建不同類型
的角色並可以靈活增加新的角色。

3.1複雜產品

//複雜產品
public class Actor {
	
	private String type;//角色類型
	private String sex;//性別
	private String face;//臉型
	private String constume;//服裝
	private String hairStyle;//髮型
	public String getType() {
		return type;
	}
	public void setType(String type) {
		this.type = type;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public String getFace() {
		return face;
	}
	public void setFace(String face) {
		this.face = face;
	}
	public String getConstume() {
		return constume;
	}
	public void setConstume(String constume) {
		this.constume = constume;
	}
	public String getHairStyle() {
		return hairStyle;
	}
	public void setHairStyle(String hairStyle) {
		this.hairStyle = hairStyle;
	}
	@Override
	public String toString() {
		return "Actor [type=" + type + ", sex=" + sex + ", face=" + face + ", constume=" + constume + ", hairStyle="
				+ hairStyle + "]";
	}
	
}

3.2抽象建造者

//抽象建造者
public abstract class ActorBuilder {

	protected Actor actor = new Actor();//爲什麼要protected
	
	public abstract void buildType();
	public abstract void buildSex();
	public abstract void buildFace();
	public abstract void buildConstume();
	public abstract void buildHGairStyle();
	
	public Actor getResult() {
		return actor;
	}
}

3.3具體建造者

//具體建造者
public class HeroBuilder extends ActorBuilder{

	@Override
	public void buildType() {
		actor.setType("英雄");
	}

	@Override
	public void buildSex() {
		actor.setSex("男");
	}

	@Override
	public void buildFace() {
		actor.setFace("帥氣");
	}

	@Override
	public void buildConstume() {
		actor.setConstume("fashion");
	}

	@Override
	public void buildHGairStyle() {
		actor.setConstume("飄逸");
	}

}
//具體建造者
public class AngelBuilder extends ActorBuilder{

	@Override
	public void buildType() {
		actor.setType("天使");
	}

	@Override
	public void buildSex() {
		actor.setSex("女");
		
	}

	@Override
	public void buildFace() {
		actor.setFace("好看");
		
	}

	@Override
	public void buildConstume() {
		actor.setConstume("裙子");
		
	}

	@Override
	public void buildHGairStyle() {
		actor.setHairStyle("烏黑長髮");
		
	}

}

3.4: 指揮者
 

//指揮者
public class ActorController {
	//關聯一個抽象建造者
	private ActorBuilder actorBuilder;
	
	public ActorController(ActorBuilder actorBuilder) {
		this.actorBuilder = actorBuilder;
	}
	
	public Actor Assemble() {
		actorBuilder.buildType();
		actorBuilder.buildSex();
		actorBuilder.buildFace();
		actorBuilder.buildConstume();
		actorBuilder.buildHGairStyle();
		return actorBuilder.getResult();
	}
}

3.5 客戶端測試代碼

public class Client {

	public static void main(String[] args) {
		//抽象建造者
		ActorBuilder actorBuilder;
		//指揮者
		ActorController actorController;
		//產品
		Actor actor;
		
		actorBuilder = new AngelBuilder();
		actorController = new ActorController(actorBuilder);
		actor = actorController.Assemble();
		System.out.println(actor);
	}
}


四:建造者模式總結
建造者模式的核心在於如何一步步構建一個包含多個組成部件的完整對象, 使用相同的構建
過程構建不同的產品, 在軟件開發中, 如果我們需要創建複雜對象並希望系統具備很好的靈
活性和可擴展性可以考慮使用建造者模式
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章