建造者模式定义:


建造者模式(Builder Pattern)又叫生成器模式**,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。
建造者模式是一步一步创建一个复杂的对象的,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要直到内部的具体构建细节。

案例代码如下:

PersonBuilder.png

  • ①:Product(产品角色):一个具体的产品对象。
  • ②:Builder(抽象建造者):创建一个Product对象的各个部件指定的接口。
  • ③:ConcreateBuilder(具体建造者):实现接口,构建和装配各个部件。
  • ④:Director(指挥者):构建一个Builder接口的对象,它主要是用于创建一个复杂的对象。它主要有两个作用
    • Ⅰ:隔离了客户和对象的生产过程;
    • Ⅱ:负责控制产品对象的生产过程。

创建一个具体产品类PersonProduct

  1. /*具体产品*/
  2. @Data
  3. public class PersonProduct {
  4. private String head;
  5. private String body;
  6. private String armLeft;
  7. private String armRight;
  8. private String legLeft;
  9. private String lefRight;
  10. }

创建一个抽象建造者PersonBuilder

  1. /*抽象建造者*/
  2. public abstract class PersonBuilder {
  3. protected PersonProduct personProduct = new PersonProduct();
  4. public PersonProduct getPersonProduct() {
  5. return personProduct;
  6. }
  7. /*头*/
  8. public abstract void buildHead();
  9. /*身*/
  10. public abstract void buildBody();
  11. /*左手*/
  12. public abstract void buildArmLeft();
  13. /*右手*/
  14. public abstract void buildArmRight();
  15. /*左腿*/
  16. public abstract void buildLegLeft();
  17. /*右退*/
  18. public abstract void buildLegRight();
  19. }

创建一个PersonBuilder的具体构建者PersonThinBuilder

  1. /*具体构建者*/
  2. public class PersonThinBuilder extends PersonBuilder {
  3. @Override
  4. public void buildHead() {
  5. System.out.println("PersonThinBuilder buildHead ...");
  6. personProduct.setHead("PersonThinBuilder buildHead ...");
  7. }
  8. @Override
  9. public void buildBody() {
  10. System.out.println("PersonThinBuilder buildBody ...");
  11. personProduct.setBody("PersonThinBuilder buildBody ...");
  12. }
  13. @Override
  14. public void buildArmLeft() {
  15. System.out.println("PersonThinBuilder buildArmLeft ...");
  16. personProduct.setArmLeft("PersonThinBuilder buildArmLeft ...");
  17. }
  18. @Override
  19. public void buildArmRight() {
  20. System.out.println("PersonThinBuilder buildArmRight ...");
  21. personProduct.setArmRight("PersonThinBuilder buildArmRight ...");
  22. }
  23. @Override
  24. public void buildLegLeft() {
  25. System.out.println("PersonThinBuilder buildLegLeft ...");
  26. personProduct.setLegLeft("PersonThinBuilder buildLegLeft ...");
  27. }
  28. @Override
  29. public void buildLegRight() {
  30. System.out.println("PersonThinBuilder buildLegRight ...");
  31. personProduct.setLefRight("PersonThinBuilder buildLegRight ...");
  32. }
  33. }

创建一个PersonBuilder的具体构建者PersonFatBuilder

  1. /*具体构建者*/
  2. public class PersonFatBuilder extends PersonBuilder{
  3. @Override
  4. public void buildHead() {
  5. System.out.println("PersonFatBuilder buildHead ...");
  6. personProduct.setHead("PersonFatBuilder buildHead ...");
  7. }
  8. @Override
  9. public void buildBody() {
  10. System.out.println("PersonFatBuilder buildBody ...");
  11. personProduct.setBody("PersonFatBuilder buildBody ...");
  12. }
  13. @Override
  14. public void buildArmLeft() {
  15. System.out.println("PersonFatBuilder buildArmLeft ...");
  16. personProduct.setArmLeft("PersonFatBuilder buildArmLeft ...");
  17. }
  18. @Override
  19. public void buildArmRight() {
  20. System.out.println("PersonFatBuilder buildArmRight ...");
  21. personProduct.setArmRight("PersonFatBuilder buildArmRight ...");
  22. }
  23. @Override
  24. public void buildLegLeft() {
  25. System.out.println("PersonFatBuilder buildLegLeft ...");
  26. personProduct.setLegLeft("PersonFatBuilder buildLegLeft ...");
  27. }
  28. @Override
  29. public void buildLegRight() {
  30. System.out.println("PersonFatBuilder buildLegRight ...");
  31. personProduct.setLefRight("PersonFatBuilder buildLegRight ...");
  32. }
  33. }

创建一个指挥者PersonDirector

  1. /*指挥者*/
  2. public class PersonDirector {
  3. private PersonBuilder personBuilder;
  4. public PersonDirector(PersonBuilder personBuilder) {
  5. this.personBuilder = personBuilder;
  6. }
  7. public void setPersonBuilder(PersonBuilder personBuilder) {
  8. this.personBuilder = personBuilder;
  9. }
  10. /*创建[PersonProduct]对象*/
  11. public PersonProduct createPerson() {
  12. personBuilder.buildHead();
  13. personBuilder.buildBody();
  14. personBuilder.buildArmLeft();
  15. personBuilder.buildArmRight();
  16. personBuilder.buildLegLeft();
  17. personBuilder.buildLegRight();
  18. return personBuilder.getPersonProduct();
  19. }
  20. }

客户端:

  1. /*客户端*/
  2. public class Client {
  3. public static void main(String[] args) {
  4. System.out.println("================== Thin Person ===================");
  5. PersonBuilder personThinBuilder = new PersonThinBuilder();
  6. PersonDirector director = new PersonDirector(personThinBuilder);
  7. PersonProduct thinPerson = director.createPerson();
  8. System.out.println("thinPerson = " + thinPerson);
  9. System.out.println("================== Fat Person ===================");
  10. PersonFatBuilder personFatBuilder = new PersonFatBuilder();
  11. director.setPersonBuilder(personFatBuilder);
  12. PersonProduct fatPerson = director.createPerson();
  13. System.out.println("fatPerson = " + fatPerson);
  14. }
  15. }

具体输出如下:

  1. ================== Thin Person ===================
  2. PersonThinBuilder buildHead ...
  3. PersonThinBuilder buildBody ...
  4. PersonThinBuilder buildArmLeft ...
  5. PersonThinBuilder buildArmRight ...
  6. PersonThinBuilder buildLegLeft ...
  7. PersonThinBuilder buildLegRight ...
  8. thinPerson = PersonProduct(head=PersonThinBuilder buildHead ..., body=PersonThinBuilder buildBody ..., armLeft=PersonThinBuilder buildArmLeft ..., armRight=PersonThinBuilder buildArmRight ..., legLeft=PersonThinBuilder buildLegLeft ..., lefRight=PersonThinBuilder buildLegRight ...)
  9. ================== Fat Person ===================
  10. PersonFatBuilder buildHead ...
  11. PersonFatBuilder buildBody ...
  12. PersonFatBuilder buildArmLeft ...
  13. PersonFatBuilder buildArmRight ...
  14. PersonFatBuilder buildLegLeft ...
  15. PersonFatBuilder buildLegRight ...
  16. fatPerson = PersonProduct(head=PersonFatBuilder buildHead ..., body=PersonFatBuilder buildBody ..., armLeft=PersonFatBuilder buildArmLeft ..., armRight=PersonFatBuilder buildArmRight ..., legLeft=PersonFatBuilder buildLegLeft ..., lefRight=PersonFatBuilder buildLegRight ...)