建造者模式

简介: 定义:将一个复杂对象的构造与它的表示分离(ConcreteBuilder 负责表示,Director负责构建),使同样的构建过程(Director可以构建不同的对象)可以创建不同的表示,这样的设计模式被称为建造者模式。(常与模板模式一起使用)


定义:将一个复杂对象的构造与它的表示分离(ConcreteBuilder 负责表示,Director负责构建),使同样的构建过程(Director可以构建不同的对象)可以创建不同的表示,这样的设计模式被称为建造者模式。(常与模板模式一起使用)

使用场景: 1、当对象的构建过程十分复杂,需要与表示分离的时候。

                  2、当对象的表示有不同种类,需要加以区分的时候

优点:1.可以很方便构建的对象

          2.对象的构造统一在一起构造,客户不关注构造过程。

          3.更加方便的替换和新增产品,不用修改原代码(只需要提供对象内容)。

缺点:1.不适合创建差异性很大的产品类。

          2.需要生成的产品对象有复杂的内部结构,这些产品对象具备共性。

类图:

image.png

结构

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. }

 


相关文章
|
6月前
|
设计模式 Java Maven
【建造者模式】
【建造者模式】
|
2月前
|
设计模式 C++
【C++】—— 建造者模式
【C++】—— 建造者模式
|
8月前
|
算法 程序员
建造者模式的运用
建造者模式的运用
28 0
|
5月前
创建型 建造者模式
创建型 建造者模式
24 0
|
5月前
|
Java Linux Spring
终于懂了建造者模式
终于懂了建造者模式
17 1
|
6月前
建造者模式
建造者模式
28 1
|
9月前
|
设计模式 C++
2023-6-13-第四式建造者模式
2023-6-13-第四式建造者模式
47 0
|
10月前
|
缓存 Java C++
建造者模式解读
建造者模式解读
建造者模式解读
|
算法
创建型模式-建造者模式
创建型模式-建造者模式
43 0
|
设计模式
我学会了,建造者模式
建造者模式属于创建型模式,这个类型的设计模式是将 对象的创建和使用解耦了,花式的去创建对象。
128 0
我学会了,建造者模式