定義:建造者模式也稱為生成器模式,將一個個簡單物件一步步構造成一個復雜的物件,將復雜物件的構建和它的表示分離,使得同樣的構建程序有不同的表示;
主要解決:系統中復雜物件的創建程序,通常由各個部分的子物件采用一定的演算法構成;由于需求的變化 ,這個復雜物件的各個部分通常面臨著劇烈的變化,但是將他們組合在一起的演算法卻相對穩定;
何時使用:一些基本部件不變,而其組合經常變化的時候;
如何解決:將變與不變相分離;
模式結構(PS:本圖是從網上找過來的):

模式角色分析:
1、產品類:是一個較為復雜的物件,這個物件的創建程序較為復雜,實際編程中可以由一個抽象類和它的不同實作組成,也可以由抽象類與他們的實作組成;
2、抽象建造者:引入抽象建造者的目的,是為了將建造的具體程序交給它的子類來實作,這樣更容易擴展,同時也符合面向介面編程的出發點,一般包含兩個抽象方法,一個用來建造產品,一個用來回傳產品;
3、建造者:實作抽象類所有未實作的方法,組件產品,回傳組裝好的產品;
4、指揮類:負責呼叫適當的建造者來組建產品,指揮類一般不與產品類發生依賴關系,與指揮類直接互動的是建造者類,一般來說指揮類被用來封裝程式中易變的部分;
應用場景:
1、創建復雜物件的演算法獨立于組成物件的部件;
2、肯德基的漢堡、可樂、薯條、炸雞等是不變的,而其組合是經常變化的,將不同的產品組合在一起,生成出來所謂的“套餐”;
3、jdk中的StringBuilder類;
4、同一個創建程序需要有不同的內部屬性的產品物件,例如建造房子,利用沙子、水泥、鋼筋既可以建造別墅也可以建造普通樓房;
優點:
1、客戶端不必知道產品組成的細節,將產品本身與產品的創建程序,使得相同的創建程序可以創建不同的產品物件;
2、每個具體建造者都獨立,因此可以方便地更換、或者增加具體的建造者,用戶使用不同的具體建造者可以得到不同的產品物件;
3、可以更精細地控制產品的創建程序,將復雜產品的創建步驟分解在不同的方法中,使得創建程序更加清晰;
4、增加新的具體的建造者不需要修改原來類別庫的代碼,指揮類針對抽象建造者類編程,系統方便擴展,符合“開閉原則”;
缺點:
1、建造者過多時,會產生很多類,難以維護;
2、建造者模式所創建的產品一般具有較多的共同點,其組成部分相似,若產品之間的差異性很大,則不適合使用該模式,使用范圍受限;
工廠模式和建造者模式聯系和區別:
工廠模式重點關注如何獲取實體物件,而建造者模式重點關注如何建造實體物件;建造者模式和工廠模式從總體上看僅僅是多了一個“指揮類”的角色,如果將“指揮類”看做是最終呼叫的客戶端,那么剩余部分就可以看做是一個簡單的工廠模式了,工廠模式是將實體物件的建造程序封裝在工廠中了,工廠直接回傳實體物件給呼叫者,而建造者模式是將實體物件的建造程序封裝在了具體的建造者類中,由“指揮類”呼叫,回傳物件給客戶端呼叫;
UML類圖:

示例代碼:
package cn.com.pep.model.builder.builder2; /** * * @Title: Builder * @Description: 抽象建造者 * @author wwh * @date 2022-9-1 9:56:08 */ public abstract class Builder { /** * * @Title: builderPartA * @Description: */ public abstract void builderPartA(); /** * * @Title: builderPartB * @Description: */ public abstract void builderPartB(); /** * * @Title: getProduct * @Description: * @return */ public abstract Product getProduct(); }
package cn.com.pep.model.builder.builder2; /** * * @Title: ConcreteBuilderA * @Description: 具體建造者A * @author wwh * @date 2022-9-1 10:00:40 */ public class ConcreteBuilderA extends Builder{ private Product product = new Product(); @Override public void builderPartA() { product.addPart("VegetableBurger"); } @Override public void builderPartB() { product.addPart("Cocacola"); } @Override public Product getProduct() { return product; } }
package cn.com.pep.model.builder.builder2; /** * * @Title: ConcreteBuilderB * @Description: 具體建造者B * @author wwh * @date 2022-9-1 10:04:48 */ public class ConcreteBuilderB extends Builder{ private Product product = new Product(); @Override public void builderPartA() { // TODO Auto-generated method stub product.addPart("ChickenBurger"); } @Override public void builderPartB() { // TODO Auto-generated method stub product.addPart("Pepsi"); } @Override public Product getProduct() { // TODO Auto-generated method stub return product; } }
package cn.com.pep.model.builder.builder2; /** * * @Title: Product * @Description: * @author wwh * @date 2022-9-1 9:50:03 */ import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * * @Title: Product * @Description: 產品類 * @author wwh * @date 2022-9-1 9:55:50 */ public class Product { List<String> parts = new ArrayList<>(); /** * * @Title: addPart * @Description: 添加產品部件 * @param part */ public void addPart(String part) { parts.add(part); } /** * * @Title: show * @Description:顯示產品細節 */ public void show() { Iterator<String> it = parts.iterator(); while (it.hasNext()) { String string = (String) it.next(); System.err.println(string); } } }
package cn.com.pep.model.builder.builder2; /** * * @Title: Director * @Description: 指揮者類 * @author wwh * @date 2022-9-1 10:12:05 */ public class Director { /** * * @Title: creatProduct * @Description: * @param builder */ public void creatProduct(Builder builder) { builder.builderPartA(); builder.builderPartB(); } }
package cn.com.pep.model.builder.builder2; /** * * @Title: BuilderPatternDemo * @Description: 測驗類 * @author wwh * @date 2022-9-1 10:13:51 */ public class BuilderPatternDemo { public static void main(String[] args) { Builder builder = new ConcreteBuilderA(); Director director = new Director(); director.creatProduct(builder); Product p = builder.getProduct(); p.show(); builder = new ConcreteBuilderB(); director.creatProduct(builder); p = builder.getProduct(); p.show(); } }
本文來自博客園,作者:一只烤鴨朝北走,僅用于技術學習,所有資源都來源于網路,部分是轉發,部分是個人總結,歡迎共同學習和轉載,轉載請在醒目位置標明原文,如有侵權,請留言告知,及時撤除,轉載請注明原文鏈接:https://www.cnblogs.com/wha6239/p/16643030.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/503425.html
標籤:其他
下一篇:設計模式之(7)——裝飾設計模式
