定义:将一个复杂对象的构造与它的表示分离(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. }