概要

  • 建造者模式属于创造型
  • Builder模式可以将一个类的构建和表示进行分离

    将一个复杂的对象的构建与它的表示分离,使
    得同样的构建过程可以创建不同的表示。创建者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。

经典模式

  1. @Data
  2. class Computer {
  3. private String cup;
  4. private String gpu;
  5. private String disk;
  6. private String ram;
  7. }
  8. @Data
  9. abstract class ComputerBuilder {
  10. abstract void setCup();
  11. abstract void setGpu();
  12. abstract void setDisk();
  13. abstract void setRam();
  14. abstract Computer getComputer();
  15. }
  16. class HigherComputerBuilder extends ComputerBuilder {
  17. private Computer computer;
  18. public HigherComputerBuilder() {
  19. this.computer = new Computer();
  20. }
  21. @Override
  22. void setCup() {
  23. computer.setCup("8G");
  24. }
  25. @Override
  26. void setGpu() {
  27. computer.setGpu("4G");
  28. }
  29. @Override
  30. void setDisk() {
  31. computer.setDisk("1T");
  32. }
  33. @Override
  34. void setRam() {
  35. computer.setRam("16G");
  36. }
  37. @Override
  38. Computer getComputer() {
  39. return computer;
  40. }
  41. }
  42. class TowerComputerBuilder extends ComputerBuilder {
  43. private Computer computer;
  44. public TowerComputerBuilder() {
  45. this.computer = new Computer();
  46. }
  47. @Override
  48. void setCup() {
  49. computer.setCup("4G");
  50. }
  51. @Override
  52. void setGpu() {
  53. computer.setGpu("2G");
  54. }
  55. @Override
  56. void setDisk() {
  57. computer.setDisk("500G");
  58. }
  59. @Override
  60. void setRam() {
  61. computer.setRam("8G");
  62. }
  63. @Override
  64. Computer getComputer() {
  65. return computer;
  66. }
  67. }
  68. class Director {
  69. private ComputerBuilder computerBuilder;
  70. public Director(ComputerBuilder computerBuilder) {
  71. this.computerBuilder = computerBuilder;
  72. }
  73. public Computer createComputerBuilder() {
  74. computerBuilder.setCup();
  75. computerBuilder.setDisk();
  76. computerBuilder.setGpu();
  77. computerBuilder.setRam();
  78. return computerBuilder.getComputer();
  79. }
  80. }
  81. public class Main {
  82. public static void main(String[] args) {
  83. Computer computer = new Director(new HigherComputerBuilder()).createComputerBuilder();
  84. System.out.println("高配:" + computer);
  85. computer = new Director(new TowerComputerBuilder()).createComputerBuilder();
  86. System.out.println("低配:" + computer);
  87. }
  88. }

变种模式

  1. @Data
  2. class Person {
  3. private String name;
  4. private String gender;
  5. private int age;
  6. private double money;
  7. private String house;
  8. }
  9. class PersonBuilder {
  10. private String name;
  11. private String gender;
  12. private int age;
  13. private double money;
  14. private String house;
  15. public PersonBuilder(String name, String gender) {
  16. this.name = name;
  17. this.gender = gender;
  18. }
  19. public PersonBuilder age(int age) {
  20. this.age = age;
  21. return this;
  22. }
  23. public PersonBuilder money(double money) {
  24. this.money = money;
  25. return this;
  26. }
  27. public PersonBuilder house(String house) {
  28. this.house = house;
  29. return this;
  30. }
  31. public Person build() {
  32. Person person = new Person();
  33. person.setName(name);
  34. person.setAge(age);
  35. person.setGender(gender);
  36. person.setMoney(money);
  37. person.setHouse(house);
  38. return person;
  39. }
  40. }
  41. public class VarietyBuilder {
  42. public static void main(String[] args) {
  43. System.out.println(new PersonBuilder("小明", "man")
  44. .age(11).house("big")
  45. .money(1111111111).build());
  46. }
  47. }