当前位置: 首页>JAVA>正文

創建型設計模模式---建造者模式

創建型設計模模式---建造者模式

設計模式

序號內容鏈接地址
1設計模式七大原則https://blog.csdn.net/qq_39668819/article/details/115390615
2創建型設計模式–工廠模式https://blog.csdn.net/qq_39668819/article/details/115375928
3創建型設計模式–抽象工廠模式https://blog.csdn.net/qq_39668819/article/details/115390992
4創建型設計模式–單例模式https://blog.csdn.net/qq_39668819/article/details/115396191
5創建型設計模式–建造者模式https://blog.csdn.net/qq_39668819/article/details/115396212
6創建型設計模式—原型模式https://blog.csdn.net/qq_39668819/article/details/115396227
7結構型設計模式—代理模式https://blog.csdn.net/qq_39668819/article/details/115480346
8結構型設計模式—適配器模式https://blog.csdn.net/qq_39668819/article/details/115499090
9結構型設計模式—橋接模式https://blog.csdn.net/qq_39668819/article/details/115560823
10結構型設計模式—裝飾模式https://blog.csdn.net/qq_39668819/article/details/115582291
11結構型設計模式—外觀模式https://blog.csdn.net/qq_39668819/article/details/115643900
12結構型設計模式—享元模式https://blog.csdn.net/qq_39668819/article/details/115680930
13結構型設計模式—組合模式https://blog.csdn.net/qq_39668819/article/details/115720713
14行為型設計模式—模板方法模式https://blog.csdn.net/qq_39668819/article/details/115774426
15行為型設計模式—策略模式https://blog.csdn.net/qq_39668819/article/details/115804292
16行為型設計模式—命令模式https://blog.csdn.net/qq_39668819/article/details/115877361
17行為型設計模式—責任鏈模式https://blog.csdn.net/qq_39668819/article/details/115981287
18行為型設計模式—狀態模式https://blog.csdn.net/qq_39668819/article/details/116077215
19行為型設計模式—觀察者模式https://blog.csdn.net/qq_39668819/article/details/116141223
20行為型設計模式—中介者模式https://blog.csdn.net/qq_39668819/article/details/116177694
21行為型設計模式—迭代器模式https://blog.csdn.net/qq_39668819/article/details/116213033
22行為型設計模式—訪問者模式https://blog.csdn.net/qq_39668819/article/details/116246907
23行為型設計模式—備忘錄模式https://blog.csdn.net/qq_39668819/article/details/116333844
24行為型設計模式—解釋器模式https://blog.csdn.net/qq_39668819/article/details/116379466

建造者模式

模式的定義與特點

建造者(Builder)模式的定義:指將一個復雜對象的構造與它的表示分離,使同樣的構建過程可以創建不同的表示,這樣的設計模式被稱為建造者模式。它是將一個復雜的對象分解為多個簡單的對象,然后一步一步構建而成。它將變與不變相分離,即產品的組成部分是不變的,但每一部分是可以靈活選擇的。

生活中這樣的例子很多,如游戲中的不同角色,其性別、個性、能力、臉型、體型、服裝、發型等特性都有所差異;還有汽車中的方向盤、發動機、車架、輪胎等部件也多種多樣;每封電子郵件的發件人、收件人、主題、內容、附件等內容也各不相同。

該模式的主要優點如下:

  • 封裝性好,構建和表示分離。

  • 擴展性好,各個具體的建造者相互獨立,有利于系統的解耦。

  • 客戶端不必知道產品內部組成的細節,建造者可以對創建過程逐步細化,而不對其它模塊產生任何影響,便于控制細節風險。

其缺點如下:

  • 產品的組成部分必須相同,這限制了其使用范圍。
  • 如果產品的內部變化復雜,如果產品內部發生變化,則建造者也要同步修改,后期維護成本較大。

建造者(Builder)模式和工廠模式的關注點不同:建造者模式注重零部件的組裝過程,而工廠方法模式更注重零部件的創建過程,但兩者可以結合使用。

模式的結構

建造者(Builder)模式的主要角色如下:

  • 產品角色(Product):它是包含多個組成部件的復雜對象,由具體建造者來創建其各個零部件。
  • 抽象建造者(Builder):它是一個包含創建產品各個子部件的抽象方法的接口,通常還包含一個返回復雜產品的方法。
  • 具體建造者(Concrete Builder):實現 Builder 接口,完成復雜產品的各個部件的具體創建方法。
  • 指揮者(Director):它調用建造者對象中的部件構造與裝配方法完成復雜對象的創建,在指揮者中不涉及具體產品的信息。
模式的實現

這里以游戲中的英雄為例來介紹建造者模式

  • 產品角色:Hero,包含了游戲角色的基本屬性,如:模型、皮膚、技能組、基礎屬性。

  • 抽象建造者:HeroBuilder ,聲明了游戲角色各個屬性的構建的抽象方法。

  • 具體建造者:CatalinaBuilderYassoBuilder 實現了指定角色的屬性的構建,提供了各個屬性的構建方法。

  • 指揮者:HeroDirector 提供一個構建具體游戲角色的方法,以具體構建者為參數。

/**
* 引入了 lombok
*/
@Getter
@Setter
@ToString
public class Hero {/*** 角色模型*/private String model;/*** 角色皮膚*/private String skin;/*** 角色技能組*/private String[] skills;/*** 角色基礎屬性*/private Map<String, String> basicProperties;}
public class Catalina extends Hero {public Catalina() {System.out.println("開始構建卡特琳娜");}
}
public class Yasso extends Hero {public Yasso() {System.out.println("開始構建亞索");}
}

抽象建造者 (Builder):包含創建產品各個子部件的抽象方法。

public interface HeroBuilder {/*** 構建模型*/void buildModel();/*** 構建皮膚*/void buildSkin();/*** 構建技能*/void buildSkills();/*** 構建基礎屬性*/void buildBasicProperties();/*** 構建英雄* @return*/Hero buildHero();
}

具體建造者:實現了抽象建造者接口。

public class CatalinaBuilder implements HeroBuilder {private Hero catalina;public CatalinaBuilder() {this.catalina = new Catalina();}@Overridepublic void buildModel() {catalina.setModel("源計劃:雄心");}@Overridepublic void buildSkin() {catalina.setSkin("源計劃:雄心");}@Overridepublic void buildSkills() {catalina.setSkills(new String[]{"貪婪【被動】", "彈射之刃", "伺機待發", "瞬步", "死亡蓮華"});}@Overridepublic void buildBasicProperties() {Map<String, String> basic = new HashMap<>();basic.put("攻擊力", "58(每級成長傷害+3.2)");basic.put("生命值", "602(每級成長生命值+94)");basic.put("法力值", "60(康夫是一個無耗藍的英雄,估計該數值只是默認值)");basic.put("移動速度", "340");basic.put("護甲", "28(每級成長護甲+3.5)");basic.put("魔抗", "32(每級成長魔抗+1.2)");basic.put("每5秒回血", "7.5+0.7");basic.put("每5秒回藍", "20");basic.put("范圍", "125");catalina.setBasicProperties(basic);}@Overridepublic Hero buildHero() {return catalina;}
}
public class YassoBuilder implements HeroBuilder {private Hero yasso;public YassoBuilder() {this.yasso = new Yasso();}@Overridepublic void buildModel() {yasso.setModel("靈魂蓮華模型");}@Overridepublic void buildSkin() {yasso.setSkin("靈魂蓮華皮膚");}@Overridepublic void buildSkills() {yasso.setSkills(new String[]{"浪客之道【被動】", "斬鋼閃", "風之障壁", "踏前斬", "狂風絕息斬"});}@Overridepublic void buildBasicProperties() {Map<String, String> basic = new HashMap<>();basic.put("攻擊力", "51.6(每級成長傷害+3.6)");basic.put("生命值", "512(每級成長生命值+82)");basic.put("法力值", "60(yasoo是一個無耗藍的英雄,估計該數值只是默認值)");basic.put("移動速度", "350");basic.put("護甲", "18.4(每級成長護甲+3.4)");basic.put("魔抗", "30");basic.put("每5秒回血", "5");basic.put("每5秒回藍", "0");basic.put("范圍", "175");yasso.setBasicProperties(basic);}@Overridepublic Hero buildHero() {return yasso;}
}

指揮者:調用建造者中的方法完成復雜對象的創建。

public class HeroDirector {/*** 構建英雄* @param roleBuilder 建造者* @return*/public Hero constructHero(HeroBuilder roleBuilder) {roleBuilder.buildModel();roleBuilder.buildSkin();roleBuilder.buildSkills();roleBuilder.buildBasicProperties();return roleBuilder.buildHero();}
}

測試

public class BuilderTest {public static void main(String[] args) {HeroDirector roleDirector = new HeroDirector();Hero catalina = roleDirector.constructHero(new CatalinaBuilder());Hero yasso = roleDirector.constructHero(new YassoBuilder());System.out.println(catalina);System.out.println(yasso);}
}
適用場景

建造者模式主要適用于以下應用場景:

  • 如果你需要創建的各種形式的產品, 它們的制造過程相似且僅有細節上的差異, 此時可使用建造者模式。
  • 建造者模式讓你能分步驟構造產品,并且你可以延遲執行某些步驟而不會影響最終產品, 你甚至可以遞歸調用這些步驟;如果有以上需求可以使用建造者模式。

https://www.nshth.com/java/298164.html
>

相关文章:

  • 有一個解謎的有外星人的游戲,【Pygame小游戲】 史上最經典的外星人游戲 ,全面保障 勇敢去闖 (未解之謎)
  • 2020年2月編程語言排行榜:Java第一,Python出現下滑!
  • 開一家手機配件店怎么樣,手機配件實體店好做不_震驚!手機實體店,你不得不防的套路!
  • bld設計公司,BLE外設設計
  • 手機如何連接外設,iOS 連接外設的幾種方式
  • 三星手機換電池視頻教程,三星2016換電池教程
  • 機械設計制造畢業設計題目,機械專業夾具類畢業設計題目匯總/組合機床、車床撥叉、飛錘支架、連接座、倒擋撥叉、蓋、法蘭盤、銅襯軸套、心軸零件、曲軸箱零件、托板、發動
  • Shell基礎(四):字符串截取及切割、字符串初值的處理、基使用Shell數組、expect預期交互、使用正則表達式...
  • shell編程入門,shell基礎之04
  • 計算機基礎知識試題及答案(全),計算機序列類型和字典試題,計算機考試試題和資料
  • 新開店鋪怎么做推廣,淘寶新開店鋪沒有生意不會推廣的苦衷與心得
  • 如何注冊商標,給大家科普一下商標小知識沒注冊下來的商標,做吊牌,做包裝袋,發朋友圈廣告時千萬不能打R。將未注冊商標冒充注冊商標使用的,或者使用未注冊商標的,最高
  • 商標繳費后多久初步審核通過,商標注冊需要多久下證
  • 商標買賣,信用百度公司商標信息爬取
  • 商標檢索網站,中國商標網 -爬蟲
  • 應用商店上架app容易么,iOS App 上架App Store及提交審核(Appuploader)
  • app證書失效了怎么辦,iOS證書申請打包上傳App Store審核完整流程(7個步驟)
  • 銀行合并后,10萬億同業存款免繳存準 全面降準將推遲
  • kindle買8g還是32g,萬字長文!對比分析了多款存儲方案,KeeWiDB最終選擇自己來
  • java中的final關鍵字有哪些用法,Java: static,final,代碼塊 的詳解
  • 服務器反應慢及解決辦法,Linux服務器 大量的CLOSE_WAIT、TIME_WAIT解決辦法
  • wait for的用法,oracle for update wait 解析
  • 如何手動關閉close_wait,CLOSE_WAIT和TIME_WAIT
  • 渲染軟件哪個好用,Windows平臺OpenGL渲染視頻
  • 怎樣說代碼讓人聽不懂,RPA初級認證直通車,不懂代碼也能成為技術大佬
  • java快速開發平臺 開源,快上車!Java技術開發大廠直通車馬上啟動!
  • 架構師培訓,Java高級:java架構師成長直通車pan
  • 【淘寶開店教程】淘寶直通車常見問題講解
  • 《java架構師成長直通車》課程階段一學習筆記
  • 視頻教程-Java面試Offer直通車-Java