定義:将一個複雜對象的構造與它的表示分離(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. }