建造者模式應用場景
建造者模式:
建造者模式,又稱構建者模式,將一部負責物件的構建分為許多小物件的構建,最後在整合構建的模式。
構建者模式一般用在構建流程或者組成部件固定的場合,將這些部件分開構建成為元件物件,再將這些元件物件整合成為目標物件。
這裡引用下別人畫的類圖:
成員分析:
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
博主百忙之中抽出時間寫部落格,實屬不易,如有轉載,請標明出處哦~~~~