1. 程式人生 > >建造者模式應用場景

建造者模式應用場景

建造者模式:

       建造者模式,又稱構建者模式,將一部負責物件的構建分為許多小物件的構建,最後在整合構建的模式。

     構建者模式一般用在構建流程或者組成部件固定的場合,將這些部件分開構建成為元件物件,再將這些元件物件整合成為目標物件。

這裡引用下別人畫的類圖:

                        

成員分析:

    Director:控制者類,這是控制整個組合過程,在這個類內部有個Construct()方法,這個方法的作用就是通過呼叫Builder內部的各個元件的生成方法來完成組裝;

    Builder:構建者介面,定義各部件生成的方法;

    ConcreteBuilder:具體構建者類:實現Builder構建者介面,具體定義如何生成各個部件;依賴於Product成品類,其中還有獲取成品組裝結構的方法GetResult()方法;

    Product:成品類

 

【關於建造者模式,我覺得理解一句話很重要】:

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

直接進入例子:

場景:玩過英雄聯盟的朋友們都知道,當自己電腦配置太差時,遊戲執行起來就特別卡頓。這時就可以手動設定降低遊戲畫質來達到遊戲執行流暢的目的。發散思維,如果我們能控制畫面某些不必要的元素,讓其不渲染,也可以達到畫面不卡頓。這樣,我們只需要在設定介面裡,設定下,畫面的清晰度,不要哪些元素。然後點下按鈕,告訴程式我就要這樣的質感。我們並不知道程式是怎麼構建的,我們知道的只是一個方法,關於構建,程式自動就幫我們構建好了。

程式碼演示:此處例子只是為了讓各位更容易理解建造者模式。當然還有很多不足的地方,也有很多不合理的地方。希望各位不要在意這些細枝末節。理解很重要!!!

1、建造者模式包的結構 

2、先看這個包  com.test.element 這裡是存放地圖元素,地圖中有樹、道路、防禦塔、野怪、等等。這裡只列舉部分。望各位體諒。程式碼多了,新手看起來老火。

(1)防禦塔類DefenseTower.java。以下實體類皆省略get  set  及構造方法。

public class DefenseTower {
	private int size; //防禦塔尺寸
	private int x;  //防禦塔x座標
	private int y; //防禦塔y座標
	private int aggressivity; //防禦塔攻擊力
	private int defenseValue; //防禦塔防禦值
}

(2)也怪類:Monster.java

public class Monster {
	private int size; //尺寸
	private int x;  //x座標
	private int y; //y座標
	private int aggressivity; //怪獸攻擊力
	private int defenseValue;  //怪獸防禦值
}

(3)道路類:Road .java

public class Road {
	private int width; //路的尺寸
	private int length; //路的長度
	private int x;  //路的x座標
	private int y;  //路的y座標
}

(4)樹類:Tree.java

public class Tree {
	private String color;  //樹顏色
	private int size;  //樹尺寸
	private int x;  //樹x座標
	private int y;  //樹y座標
}

2、com.test.resources 包下的 Resources.java類為模擬使用者下載的地圖資源

public class Resources {
	//模擬下載了防禦塔
	public DefenseTower getDefenseTower(){
		return new DefenseTower(12, 50, 50, 100, 80);
	}
	//模擬下載了道路
	public Road getRoad(){
		return new Road(300, 2000, 50, 50);
	}
	//模擬下載了樹
	public Tree getTree(){
		return new Tree("綠色", 5, 20, 100);
	}
	//模擬下載了野怪
	public Monster getMonster(){
		return new Monster(18, 60, 150, 75, 40);
	}
}

3、com.test.build 包下是重點

(1)、構建地圖的介面:Build.java  對應於建造者角色中的Builder:構建者介面

public interface Build {
	Build  buildDefenseTower(DefenseTower defenseTower); //構建防禦塔
	Build  buildRoad(Road road); //構建道路
	Build  buildTree(Tree tree); //構建樹
	Build  buildMonster(Monster monster); //構建怪獸
	Build  buildMusic(String music); //構建背景音樂
	Build  buildPx(String px); //構建清晰度
	Map getMap();  //得到構建的地圖
}

(2)、具體實現構建地圖介面類:CreateMap.java  對應於建造者角色中的ConcreteBuilder:具體構建者類

public class CreateMap implements Build{
	private Map map = new Map();
	@Override
	public Map getMap() {
		return map;
	}
	@Override
	public CreateMap  buildDefenseTower(DefenseTower defenseTower) {
		map.setDefenseTower(defenseTower);
		return this;
	}
	@Override
	public CreateMap  buildRoad(Road road) {
		map.setRoad(road);
		return this;
	}
	@Override
	public CreateMap buildTree(Tree tree) {
		map.setTree(tree);
		return this;
	}
	@Override
	public CreateMap buildMonster(Monster monster) {
		map.setMonster(monster);
		return this;
	}
	@Override
	public CreateMap buildMusic(String music) {
		map.setMusic(music);
		return this;
	}
	@Override
	public CreateMap buildPx(String px) {
		map.setPx(px);
		return this;
	}
}

(3)、建造者類:Director.java  執行地圖的各種元素構建,組裝,最後生成地圖 

public class Director {
	//建立地圖的介面具體實現類
	private Build build = new CreateMap();
	//模擬載入使用者下載的地圖
	private Resources resources = new Resources();
	//開始構建地圖,這裡有兩個引數用於客戶端傳引數,px:為清晰度;ishasMusic:為是否載入背景音樂
	public Map createMap(String px,boolean ishasMusic){
		build.buildRoad(resources.getRoad())
			.buildDefenseTower(resources.getDefenseTower())
			.buildTree(resources.getTree())
			.buildMonster(resources.getMonster())
			.buildMusic(ishasMusic==true?"載入音樂":"無音樂")
			.buildPx(px);
		return build.getMap();
	}
}

(4)、地圖類:Map.java 地圖的組成部分。 對應於建造者角色中的 Product:成品類

public class Map {
	private DefenseTower defenseTower; //防禦塔
	private Road road;  //道路
	private Tree tree;  // 樹
	private Monster monster;  // 怪物
	private String music;  //音樂
	private String px;  //畫素
}

4、com.test.clienter 包 中的 Clienter.java 類為模擬客戶端

public class Clienter {
	public static void main(String[] args) {
		//首先擁有一個建造者。 在遊戲介面可能就是一個按鈕。
		Director director = new Director();
		//我要高品質,並且加音樂的
		Map createMap = director.createMap("100%", true);
		System.out.println(createMap);
		//中品質的畫面
		Map createMap1 = director.createMap("80%", true);
		System.out.println(createMap1);
		//電腦太差了,低品質的
		Map createMap2 = director.createMap("50%", false);
		System.out.println(createMap2);
	}
}

 

程式碼demo:https://github.com/alwaysInRoad/test-builder-pattern.git

如果覺得對你有幫助,乃是我莫大榮幸。若有不懂的地方,可以給我留言,或者加我qq:1226500260

博主百忙之中抽出時間寫部落格,實屬不易,如有轉載,請標明出處哦~~~~