天天看點

建造者模式

定義:将一個複雜對象的構造與它的表示分離(ConcreteBuilder 負責表示,Director負責建構),使同樣的建構過程(Director可以建構不同的對象)可以建立不同的表示,這樣的設計模式被稱為建造者模式。(常與模闆模式一起使用)

使用場景: 1、當對象的建構過程十分複雜,需要與表示分離的時候。

                   2、當對象的表示有不同種類,需要加以區分的時候

優點:1.可以很友善建構的對象 

           2.對象的構造統一在一起構造,客戶不關注構造過程。

           3.更加友善的替換和新增産品,不用修改原代碼(隻需要提供對象内容)。

缺點:1.不适合建立差異性很大的産品類。

           2.需要生成的産品對象有複雜的内部結構,這些産品對象具備共性。

類圖:

建造者模式

結構

product需要的複雜對象

1. public class Product 
2. {
3. private String A; //可以是任意類型
4. private String B;
5. private String C;
6. private String D;
7. //get set方法
8. 
9. }      

Builder類

1. public abstract class Builder
2. {
3. protected Product product=new Product();
4. 
5. public abstract void buildA();
6. public abstract void buildB();
7. public abstract void buildC();
8. 
9. public Product getResult()
10.     {
11. return product;
12.     }
13. }      

ConcreteBuilder 類

1. public class ConcreteBuilder extends Builder{
2. public void buildPartA(){
3.     ...
4.     }
5. public void buildPartB(){
6.     ...
7.     }
8. public void buildPartC(){
9.     ...
10.     }
11. }      

指揮者類

1. public class Director
2. {
3. private Builder builder;
4. //1 構造方法的方式注入builder對象
5. public Director(Builder builder)
6.     {
7. this.builder=builder;
8.     }
9. //2 set方法注入builder對象
10. public void setBuilder(Builder builder)
11.     {
12. this.builder=builer;
13.     }
14. 
15. public Product construct()
16.     {   
17. //将存在的ConcreteBuilder 直接組裝
18.         builder.buildPartA();
19.         builder.buildPartB();
20.         builder.buildPartC();
21. return builder.getResult();
22.     }
23. }      

具體栗子

要建構的具體對象

1. public class Person{
2. 
3. //上衣
4. private String jacket;
5. 
6. //下裝
7. private String bottling;
8. 
9. //戒子
10. private String ring;
11. 
12. //武器
13. private String arms;
14. 
15. //手镯
16. private String bracelet;
17. 
18. //鞋
19. private String shoes;
20. 
21. //get set方法
22. 
23. }      

Builder類(一個抽象構造者,個人了解 需要一個抽象類實作多态的固定寫法 應該也可以為接口 但是需要在每個實作類中增加共同的方法)

1. public abstract class PersonBuilder {
2.     Person person= new Person();
3. 
4. public abstract void buildJacket();
5. 
6. public abstract void buildBottling();
7. 
8. public abstract void buildRing();
9. 
10. public abstract void buildArms();
11. 
12. public abstract void buildBracelet();
13. 
14. public abstract void buildShoes();
15. 
16. public Person getPerson(){
17. return person;
18.     }
19. }      

ConcreteBuilder類(現有的對象模型的種類)

1. public class ChargeMoney extends Person{
2. 
3. public void buildJacket(){
4.        person.setJacket("金光閃閃上衣");
5.     };
6. 
7. public void buildBottling(){
8.        person.setBottling("亮瞎眼的褲子");
9.     };
10. 
11. public void buildRing(){
12.        person.setRing("钛合金戒子");
13.     };
14. 
15. public void buildArms(){
16.        person.setArms("40米長大砍刀");
17.     };
18. 
19. public void buildBracelet(){
20.        person.setArms("金溜子");
21.     };
22. 
23. public void buildShoes(){
24.        person.setShoes("大頭皮鞋");
25.     };
26. }      
1. public class NoChargeMoney extends Person{
2. 
3. public void buildJacket(){
4.        person.setJacket("花式囚衣");
5.     };
6. 
7. public void buildBottling(){
8.        person.setBottling("三角褲頭");
9.     };
10. 
11. public void buildRing(){
12.        person.setRing("草戒子");
13.     };
14. 
15. public void buildArms(){
16.        person.setArms("牙簽");
17.     };
18. 
19. public void buildBracelet(){
20.        person.setArms("柳樹條");
21.     };
22. 
23. public void buildShoes(){
24.        person.setShoes("10塊錢三雙拖鞋");
25.     };
26. }      

Director(對類構造的整體控制,同時對客戶隔絕)

1. public class GameGM{
2. private PersonBuilder personBuilder ;
3. 
4. public GameGM(PersonBuilder personBuilder ) {
5. this.personBuilder = personBuilder ;
6.     }
7. 
8. 
9. public Person construct(){
10. //進行構造
11.         personBuilder.buildJacket();
12.         personBuilder.buildBottling();
13.         personBuilder.buildRing();
14.         personBuilder.buildArms();
15.         personBuilder.buildBracelet();
16.         personBuilder.buildShoes();
17. 
18. //準備完畢,傳回一個人員模型
19. return personBuilder.getPerson();
20.     }
21. }      

客戶調用

1. public class Test {
2. public static void main(String[] args) {
3. //即可擷取到對象
4. ChargeMoney a = new ChargeMoney();
5. GameGM gm = new GameGM(a);
6. Meal mealA = gm.construct();      
7. 
8.     }
9. }      

繼續閱讀