设计模式 -- 建造者模式

发布时间:2022-03-01 11:52:53 作者:yexindonglai@163.com 阅读(918)

   建造者模式

原话:将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示;

其实就是将一个对象详细化,比如把人分为美国人、日本人、中国人、韩国人、非洲人,每一种人都有不同的肤色、身高、头部特征;

其实仔细看,建造者模式和工厂模式很像,很多人将这2者傻傻分不清楚,其实,工厂模式创建的是单个类,而建造者模式是将一个类型的东西集中起来进行管理,比如人类,它的里面会有很多分类:

    1、黑皮肤、大高个、做事拖拉懒散,将这三者结合起来就成为一个类型:黑人;

    2、黄皮肤、个子纤瘦、做事严谨、严丝合缝,将这四者结合起来就成为一个类型:日本人;

 

像肯德基或者麦当劳里面的套餐,将汉堡、可乐 、奶茶、薯条、鸡排等分别建造出来,通过不同的组合就成了1 + 1 =12的两件套套餐,

建造者模型如下图

建造者模式代码

  1. package com.designPatterm.create;
  2. /*
  3. 设计模式-- 建造者模式
  4. */
  5. public class CreateModel {
  6. public static void main(String[] args) {
  7. PersonDirector pb = new PersonDirector();
  8. Person meiguo = pb.constructPerson(new MeiGuoBuilder());
  9. System.out.println(meiguo.getName());
  10. System.out.println(meiguo.getHead());
  11. System.out.println(meiguo.getBody());
  12. System.out.println(meiguo.getColor());
  13. System.out.println("----------我是分割线-------------");
  14. Person china = pb.constructPerson(new ChinaBuilder());
  15. System.out.println(china.getName());
  16. System.out.println(china.getHead());
  17. System.out.println(china.getBody());
  18. System.out.println(china.getColor());
  19. }
  20. }
  21. // 建立一个人物对象Person
  22. class Person {
  23. private String name; // 国家人名
  24. private String head; // 头部特诊
  25. private String body; // 身体特诊
  26. private String color; // 肤色
  27. public String getName() { return name; }
  28. public void setName(String name) { this.name = name; }
  29. public String getHead() { return head; }
  30. public void setHead(String head) { this.head = head; }
  31. public String getBody() { return body; }
  32. public void setBody(String body) { this.body = body; }
  33. public String getColor() { return color; }
  34. public void setColor(String color) { this.color = color; }
  35. }
  36. //Builder(给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建)
  37. interface PersonBuilder {
  38. void builderName();
  39. void builderHead();
  40. void builderBody();
  41. void builderColor();
  42. Person BuilderPersion(); //组装
  43. }
  44. // 美国人 // ConcreteBuilder(实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例)
  45. class MeiGuoBuilder implements PersonBuilder {
  46. private Person person;
  47. public MeiGuoBuilder() {
  48. person = new Person();//创建一个Person实例,用于调用set方法
  49. }
  50. @Override
  51. public void builderName() {
  52. person.setName("美国人");
  53. }
  54. public void builderHead() {
  55. person.setHead("瓜子脸");
  56. }
  57. public void builderBody() {
  58. person.setBody("高大威猛");
  59. }
  60. public void builderColor() {
  61. person.setColor("白皮肤");
  62. }
  63. public Person BuilderPersion() {
  64. return person;
  65. }
  66. }
  67. // 中国人 // ConcreteBuilder(实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例)
  68. class ChinaBuilder implements PersonBuilder {
  69. private Person person;
  70. public ChinaBuilder() {
  71. person = new Person();//创建一个Person实例,用于调用set方法
  72. }
  73. @Override
  74. public void builderName() {
  75. person.setName("中国人");
  76. }
  77. public void builderHead() {
  78. person.setHead("东方人面孔");
  79. }
  80. public void builderBody() {
  81. person.setBody("身材中等");
  82. }
  83. public void builderColor() {
  84. person.setColor("黄皮肤");
  85. }
  86. public Person BuilderPersion() {
  87. return person;
  88. }
  89. }
  90. // Director(调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建)
  91. class PersonDirector {
  92. public Person constructPerson(PersonBuilder pb) {
  93. pb.builderName();
  94. pb.builderHead();
  95. pb.builderBody();
  96. pb.builderColor();
  97. return pb.BuilderPersion();
  98. }
  99. }

打印结果

  1. 美国人
  2. 瓜子脸
  3. 高大威猛
  4. 白皮肤
  5. ----------我是分割线-------------
  6. 中国人
  7. 东方人面孔
  8. 身材中等
  9. 黄皮肤
  10. Process finished with exit code 0

 

关键字设计模式