初識設計模式(建造者模式)
阿新 • • 發佈:2018-08-12
auth div bsp ddp des print 生成 pub 定義
前言:繼續學習設計模式,今天學習建造者模式。
建造者模式(Builder Pattern)
定義
又叫生成器模式。將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。
設計原則
依賴倒轉原則,抽象不應該依賴細節,細節應該依賴抽象。
目的
如果我們用了建造者模式,那麽用戶就只需要指定需要建造的類型就可以得到他們,而具體建造的過程和細節就不需要知道了。
什麽時候使用
主要用於創建一些復雜的對象,這些對象內部構建間的建造順序通常是穩定的(產品對象具有共性),但對象內部的構建通常面臨著復雜的變化。
好處
使得建造者代碼與表示代碼分離,達到解耦。
由於建造者隱藏了該產品是如何組裝的,所以若要改變一個產品的內部表示,只需要再定義一個具體的建造者就可以了,符合“開閉原則”。
將復雜產品的創建步驟分解在不同的方法中,使得創建過程更加清晰,易於精確控制對象的創建。
缺點
建造者模式所創建的產品一般具有較多的共同點,其組成部分相似;如果產品之間的差異性很大,則不適合使用建造者模式,因此其使用範圍受到一定的限制。
如果產品的內部變化復雜,可能會導致需要定義很多具體建造者類來實現這種變化,導致系統變得很龐大。
結構圖
基本代碼
具體產品
package designpatterns.builder; import java.util.ArrayList; import java.util.List; /** * 具體產品 * @author yule * @date 2018/8/12 13:32*/ public class Product { private List<String> parts = new ArrayList<>(); /** * 添加產品部件 * @param part */ public void addPart(String part){ parts.add(part); } /** * 列舉所有產品部件 */ public void show(){ System.out.println("產品創建:");for(String part : parts){ System.out.println(part); } } }
創建抽象建造者,假設一個產品需要partA,partB組成
package designpatterns.builder; /** * 抽象建造者 * @author yule * @date 2018/8/12 13:36 */ public abstract class Builder { public abstract void builderPartA(); public abstract void builderPartB(); public abstract Product getProduct(); }
創建具體建造者1
package designpatterns.builder; /** * 具體建造者1 * @author yule * @date 2018/8/12 13:37 */ public class ConcreteBuilder1 extends Builder{ private Product product = new Product(); @Override public void builderPartA() { product.addPart("部件A1"); } @Override public void builderPartB() { product.addPart("部件B1"); } @Override public Product getProduct() { return product; } }
創建具體建造者2
package designpatterns.builder; /** * 具體建造者2 * @author yule * @date 2018/8/12 13:39 */ public class ConcreteBuilder2 extends Builder{ private Product product = new Product(); @Override public void builderPartA() { product.addPart("部件A2"); } @Override public void builderPartB() { product.addPart("部件B2"); } @Override public Product getProduct() { return product; } }
創建指揮者,用來指揮創建過程
package designpatterns.builder; /** * 指揮者,用來指揮創建過程 * @author yule * @date 2018/8/12 13:40 */ public class Director { public void Construct(Builder builder){ builder.builderPartA(); builder.builderPartB(); } }
客戶端代碼,客戶不需要知道具體的建造過程
public static void main(String[] args){ Director director = new Director(); Builder builder1 = new ConcreteBuilder1(); director.Construct(builder1); Product product1 = builder1.getProduct(); product1.show(); Builder builder2 = new ConcreteBuilder2(); director.Construct(builder2); Product product2 = builder2.getProduct(); product2.show(); }
初識設計模式(建造者模式)