1.建造者模式概念
定義: 將一個復雜的對象構建與其表示相分離,使得同樣的構建過程可以創建不同的表示;
核心 : 構建與表示分離,同構建不同表示
區別于 抽象工廠模式 :
(1)與抽象工廠模式 相似,因為它也可以創建復雜對象。主要的區別是建造者模式著重于 一步步構造一個復雜對象,關注的是零件類型和裝配工藝的順序 。而抽象工廠模式著重于多個系列的產品對象(簡單的或是復雜的)。建造者模式在最后的一步返回產品,而對于抽象工廠來說,產品是立即返回的。
(2)在建造者模式里,有個指導者,由指導者來管理建造者,用戶是與指導者聯系的,指導者聯系建造者最后得到產品。即建造模式可以強制實行一種分步驟進行的建造過程。
2.它的角色
(1)抽象建造者(Builder)角色:該角色 是用于規范產品的各個組成部分,并進行抽象,一般獨立于應用程序的邏輯。
(2)具體建造者( ConcreteBuilder )角色:
該角色實 現出抽象建造者中定義的所有方法,并且返回一個組建好的產品實例。
(3)產品( Product )角色:
該角色是建造中的復雜對象,一個系統中會有多于一個的產品類,這些產品并不一定有公共的接口,完全可以是不相關聯的。
(4)指導者(Director)角色:
該角色負責安排已有的模塊的順序,然后告訴建造者 Builder開始建造 。
3.實例
1 2 3 4 5 6 | public interface Builder { void buildPartA(); void buildPartB(); void buildPartC(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public class BuilderImpl implements Builder { @Override public void buildPartA() { System.out.println( "建造部件A" ); } @Override public void buildPartB() { System.out.println( "建造部件B" ); } @Override public void buildPartC() { System.out.println( "建造部件C" ); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public class BuilderImpl2 implements Builder { @Override public void buildPartA() { System.out.println( "建造部件AA" ); } @Override public void buildPartB() { System.out.println( "建造部件BB" ); } @Override public void buildPartC() { System.out.println( "建造部件CC" ); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | /** * 指揮者:指導 如何 建造 * 組合Builder */ public class Director { private Builder builder; public Director(Builder builder) { this .builder = builder; } /** * 建造方法:定義了建造的流程 * 如果需要其他流程來實現,再new一個指揮者Director就可 */ public void construct() { System.out.println( "director 指揮 builder進行建造" ); builder.buildPartA(); builder.buildPartB(); builder.buildPartC(); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public class Director2 { private Builder builder; public Director2(Builder builder) { this .builder = builder; } /** * 建造方法:定義了建造的流程 * 如果需要其他流程來實現,再new一個指揮者Director就可 */ public void construct() { System.out.println( "director2 指揮 builder進行建造" ); builder.buildPartB(); builder.buildPartC(); builder.buildPartA(); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | public class Test { public static void main(String[] args) { Builder builder = new BuilderImpl(); Director director = new Director(builder); /* * 同樣的構建過程,不同的模塊(buildPartA、buildPartB、buildPartC)實現, new一個builder的實現 * 不同的構建過程,new 一個director * 不同的構建過程,不同的模塊實現, new director,new builder */ director.construct(); System.out.println( "" ); Builder builder2 = new BuilderImpl2(); Director director2 = new Director(builder2); director2.construct(); System.out.println( "" ); Builder builder3 = new BuilderImpl2(); Director2 director3 = new Director2(builder3); director3.construct(); } } |
打印:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | director 指揮 builder進行建造 建造部件A 建造部件B 建造部件C director 指揮 builder進行建造 建造部件AA 建造部件BB 建造部件CC director2 指揮 builder進行建造 建造部件BB 建造部件CC 建造部件AA |
4.優缺點
(1)優點:
A.可以讓你改變產品的內部表示。
B.封裝建筑和代表性的代碼。
C.提供超過施工工藝的步驟的控制。
(2)缺點:
A.需要創造各種不同類型的產品單獨ConcreteBuilder。
5.使用場景:
(1)當創建復雜對象的算法應該獨立于該對象的組成部分以及它們的裝配方式時。
(2)當構造過程必須允許被構造的對象有不同表示時( 相同的方法,不同的執行順序,產生不同的結果時)。