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

    1. //创建身体实体类
    2. package com.md.structure;
    3. //分身类
    4. public class Doppelganger {
    5. private String name;
    6. private String body;
    7. private String head;
    8. private String leftArm;
    9. private String leftHand;
    10. private String rightArm;
    11. private String rightHand;
    12. private String leftFoot;
    13. private String leftLeg;
    14. private String rightFoot;
    15. public Doppelganger(String name) {
    16. this.name = name;
    17. }
    18. public String getName() {
    19. return name;
    20. }
    21. public void setName(String name) {
    22. this.name = name;
    23. }
    24. public String getBody() {
    25. return body;
    26. }
    27. public void setBody(String body) {
    28. this.body = body;
    29. }
    30. public String getHead() {
    31. return head;
    32. }
    33. public void setHead(String head) {
    34. this.head = head;
    35. }
    36. public String getLeftArm() {
    37. return leftArm;
    38. }
    39. public void setLeftArm(String leftArm) {
    40. this.leftArm = leftArm;
    41. }
    42. public String getLeftHand() {
    43. return leftHand;
    44. }
    45. public void setLeftHand(String leftHand) {
    46. this.leftHand = leftHand;
    47. }
    48. public String getRightArm() {
    49. return rightArm;
    50. }
    51. public void setRightArm(String rightArm) {
    52. this.rightArm = rightArm;
    53. }
    54. public String getRightHand() {
    55. return rightHand;
    56. }
    57. public void setRightHand(String rightHand) {
    58. this.rightHand = rightHand;
    59. }
    60. public String getLeftFoot() {
    61. return leftFoot;
    62. }
    63. public void setLeftFoot(String leftFoot) {
    64. this.leftFoot = leftFoot;
    65. }
    66. public String getLeftLeg() {
    67. return leftLeg;
    68. }
    69. public void setLeftLeg(String leftLeg) {
    70. this.leftLeg = leftLeg;
    71. }
    72. public String getRightFoot() {
    73. return rightFoot;
    74. }
    75. public void setRightFoot(String rightFoot) {
    76. this.rightFoot = rightFoot;
    77. }
    78. }
    79. //构建建造接口
    80. package com.md.structure;
    81. public interface DoppelgangerBuilder {
    82. public void createDoppelganger(String name);
    83. public void buildBody();
    84. public void buildHead();
    85. public void buildLeftArm();
    86. public void buildLeftHand();
    87. public void buildRightArm();
    88. public void buildRightHand();
    89. public void buildLeftLeg();
    90. public void buildLeftFoot();
    91. public void buildRightLeg();
    92. public void buildRightFoot();
    93. public Doppelganger getDoppelganger();
    94. }
    95. //构建不同的实现 胖子和瘦子
    96. package com.md.structure;
    97. public class ThinBuilder implements DoppelgangerBuilder {
    98. private Doppelganger doppelganger;
    99. @Override
    100. public void createDoppelganger(String name) {
    101. doppelganger = new Doppelganger( name );
    102. }
    103. public void buildBody() {
    104. System.out.println( "设置" + doppelganger.getName() + "的瘦瘦的身体" );
    105. doppelganger.setBody( "瘦瘦的身体" );
    106. }
    107. public void buildHead() {
    108. System.out.println( "设置" + doppelganger.getName() + "的小小的头" );
    109. doppelganger.setHead( "小小的头" );
    110. }
    111. public void buildLeftArm() {
    112. System.out.println( "设置" + doppelganger.getName() + "的瘦瘦的左胳膊" );
    113. doppelganger.setLeftArm( "瘦瘦的左胳膊" );
    114. }
    115. public void buildLeftHand() {
    116. System.out.println( "设置" + doppelganger.getName() + "的瘦瘦的左手" );
    117. doppelganger.setLeftHand( "瘦瘦的左手" );
    118. }
    119. public void buildRightArm() {
    120. System.out.println( "设置" + doppelganger.getName() + "的瘦瘦的右胳膊" );
    121. doppelganger.setRightArm( "瘦瘦的右胳膊" );
    122. }
    123. public void buildRightHand() {
    124. System.out.println( "设置" + doppelganger.getName() + "的瘦瘦的右手" );
    125. doppelganger.setRightHand( "瘦瘦的右手" );
    126. }
    127. public void buildLeftLeg() {
    128. System.out.println( "设置" + doppelganger.getName() + "的瘦瘦的左腿" );
    129. doppelganger.setLeftLeg( "瘦瘦的左腿" );
    130. }
    131. public void buildLeftFoot() {
    132. System.out.println( "设置" + doppelganger.getName() + "的小小的左脚" );
    133. doppelganger.setLeftFoot( "小小的左脚" );
    134. }
    135. @Override
    136. public void buildRightLeg() {
    137. System.out.println( "左脚" );
    138. }
    139. public void buildRightFoot() {
    140. System.out.println( "设置" + doppelganger.getName() + "的小小的右脚" );
    141. doppelganger.setRightFoot( "小小的右脚" );
    142. }
    143. @Override
    144. public Doppelganger getDoppelganger() {
    145. if (doppelganger == null) {
    146. return null;
    147. } else {
    148. return doppelganger;
    149. }
    150. }
    151. }
    152. package com.md.structure;
    153. public class FatBuilder implements DoppelgangerBuilder {
    154. private Doppelganger doppelganger;
    155. public void createDoppelganger(String name) {
    156. doppelganger = new Doppelganger( name );
    157. }
    158. public Doppelganger getDoppelganger() {
    159. try {
    160. return doppelganger;
    161. } finally {
    162. doppelganger = null;
    163. }
    164. }
    165. public void buildBody() {
    166. System.out.println( "设置" + doppelganger.getName() + "的胖胖的身体" );
    167. doppelganger.setBody( "胖胖的身体" );
    168. }
    169. public void buildHead() {
    170. System.out.println( "设置" + doppelganger.getName() + "的大大的头" );
    171. doppelganger.setHead( "大大的头" );
    172. }
    173. public void buildLeftArm() {
    174. System.out.println( "设置" + doppelganger.getName() + "的胖胖的左胳膊" );
    175. doppelganger.setLeftArm( "胖胖的左胳膊" );
    176. }
    177. public void buildLeftHand() {
    178. System.out.println( "设置" + doppelganger.getName() + "的胖胖的左手" );
    179. doppelganger.setLeftHand( "胖胖的左手" );
    180. }
    181. public void buildRightArm() {
    182. System.out.println( "设置" + doppelganger.getName() + "的胖胖的右胳膊" );
    183. doppelganger.setRightArm( "胖胖的右胳膊" );
    184. }
    185. public void buildRightHand() {
    186. System.out.println( "设置" + doppelganger.getName() + "的胖胖的右手" );
    187. doppelganger.setRightHand( "胖胖的右手" );
    188. }
    189. public void buildLeftLeg() {
    190. System.out.println( "设置" + doppelganger.getName() + "的胖胖的左腿" );
    191. doppelganger.setLeftLeg( "胖胖的左腿" );
    192. }
    193. public void buildLeftFoot() {
    194. System.out.println( "设置" + doppelganger.getName() + "的大大的左脚" );
    195. doppelganger.setLeftFoot( "大大的左脚" );
    196. }
    197. @Override
    198. public void buildRightLeg() {
    199. System.out.println( "左脚" );
    200. }
    201. public void buildRightFoot() {
    202. System.out.println( "设置" + doppelganger.getName() + "的大大的右脚" );
    203. doppelganger.setRightFoot( "大大的右脚" );
    204. }
    205. }
    206. //那么 灵魂类只需要传入不同的具体实现就可以进行构造出来不同的对象了
    207. package com.md.structure;
    208. //灵魂
    209. public class Soul {
    210. public Doppelganger createDoppelganger(DoppelgangerBuilder doppelgangerBuilder, String name) {
    211. doppelgangerBuilder.createDoppelganger( name );
    212. doppelgangerBuilder.buildBody();
    213. doppelgangerBuilder.buildHead();
    214. doppelgangerBuilder.buildLeftArm();
    215. doppelgangerBuilder.buildLeftHand();
    216. doppelgangerBuilder.buildRightArm();
    217. doppelgangerBuilder.buildRightHand();
    218. doppelgangerBuilder.buildLeftLeg();
    219. doppelgangerBuilder.buildLeftFoot();
    220. doppelgangerBuilder.buildRightLeg();
    221. doppelgangerBuilder.buildRightFoot();
    222. return doppelgangerBuilder.getDoppelganger();
    223. }
    224. }
    225. public static void main(String[] args) {
    226. Soul soul = new Soul();
    227. System.out.println( "----------------------------------------" );
    228. //制造一个瘦小的看守所的人员
    229. System.out.println("获得了" + soul.createDoppelganger(new ThinBuilder(),"看守所人员1"));
    230. System.out.println("----------------------------------------");
    231. //制造一个胖胖的看守所的人员
    232. System.out.println("获得了" + soul.createDoppelganger(new FatBuilder(),"看守所人员2"));
    233. }
    234. }