经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
大话设计模式笔记(十)の建造者模式
来源:cnblogs  作者:callmeDevil  时间:2019/7/22 10:48:53  对本文有异议

举个栗子

问题描述

画一个小人,有头、身体、两手、两脚就可以了。

简单实现

人类

  1. /**
  2. * 人类
  3. * Created by callmeDevil on 2019/7/21.
  4. */
  5. public class Person {
  6. public void drawHead() {
  7. System.out.print("头 ");
  8. }
  9. public void drawBody() {
  10. System.out.print("身体 ");
  11. }
  12. public void drawHand() {
  13. System.out.print("两手 ");
  14. }
  15. public void drawLeg() {
  16. System.out.print("两脚 ");
  17. }
  18. }

测试

  1. public class Test {
  2. public static void main(String[] args) {
  3. Person person = new Person();
  4. person.drawHead();
  5. person.drawBody();
  6. person.drawHand();
  7. person.drawLeg();
  8. }
  9. }

测试结果

  1. 身体 两手 两脚

存在问题

画人的时候,头身手脚是必不可少的,不管什么人物,开发时是不能少的。但上面测试代码中时各部分堆积起来,很容易漏写,比如导致健全的人物却少了一条“腿”。而且如果需要在别的地方用这些画小人的程序怎么办?

简单实现2

瘦人类

  1. /**
  2. * 瘦人类
  3. * Created by callmeDevil on 2019/7/21.
  4. */
  5. public class PersonThinBuilder {
  6. private Person person;
  7. public PersonThinBuilder(Person person){
  8. this.person = person;
  9. System.out.println("瘦人类:");
  10. }
  11. // 建造瘦子
  12. public void build(){
  13. person.drawHead();
  14. person.drawBody();
  15. person.drawHand();
  16. person.drawLeg();
  17. }
  18. }

胖人类

  1. /**
  2. * 胖人类
  3. * Created by callmeDevil on 2019/7/21.
  4. */
  5. public class PersonFatBuilder {
  6. // 代码与瘦人类类似
  7. }

测试

  1. public class Test2 {
  2. public static void main(String[] args) {
  3. Person person = new Person();
  4. PersonThinBuilder thin = new PersonThinBuilder(person);
  5. thin.build();
  6. System.out.println();
  7. PersonFatBuilder fat = new PersonFatBuilder(person);
  8. fat.build();
  9. }
  10. }

测试结果

  1. 瘦人类:
  2. 身体 两手 两脚
  3. 胖人类:
  4. 身体 两手 两脚

存在问题

这样写的确达到了可以复用这两个画小人的目的,但容易“缺胳膊少腿”的问题,依然没有解决,比如现在需要加一个高个的小人,同样会因为编程不注意,产生同样问题。

建造者模式

定义

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 如果使用建造者模式,那么用户就只需指定需要建造的类型就可以得到它们,而具体建造的过程和细节就不需要知道了。

UML图

代码实现

建造人抽象类

  1. /**
  2. * 建造人抽象类
  3. * Created by callmeDevil on 2019/7/21.
  4. */
  5. public abstract class PersonBuilder {
  6. protected Person person;
  7. public PersonBuilder(Person person){
  8. this.person = person;
  9. }
  10. public abstract void buildHead();
  11. public abstract void buildBody();
  12. public abstract void buildArmLeft();
  13. public abstract void buildArmRight();
  14. public abstract void buildLegLeft();
  15. public abstract void buildLegRight();
  16. }

瘦人类2

  1. /**
  2. * 瘦人类2
  3. * Created by callmeDevil on 2019/7/21.
  4. */
  5. public class PersonThinBuilder extends PersonBuilder {
  6. public PersonThinBuilder(Person person){
  7. super(person);
  8. }
  9. @Override
  10. public void buildHead() {
  11. System.out.print("头 ");
  12. }
  13. @Override
  14. public void buildBody() {
  15. System.out.print("身体 ");
  16. }
  17. @Override
  18. public void buildArmLeft() {
  19. System.out.print("左手 ");
  20. }
  21. @Override
  22. public void buildArmRight() {
  23. System.out.print("右手 ");
  24. }
  25. @Override
  26. public void buildLegLeft() {
  27. System.out.print("左脚 ");
  28. }
  29. @Override
  30. public void buildLegRight() {
  31. System.out.print("右脚 ");
  32. }
  33. }

胖人类2

  1. /**
  2. * 胖人类2
  3. * Created by callmeDevil on 2019/7/21.
  4. */
  5. public class PersonFatBuilder extends PersonBuilder{
  6. // 代码与瘦人类2类似
  7. }

建造人指挥者

  1. /**
  2. * 建造人指挥者
  3. * Created by callmeDevil on 2019/7/21.
  4. */
  5. public class PersonDirector {
  6. private PersonBuilder builder;
  7. public PersonDirector(PersonBuilder builder){
  8. // 用户告诉指挥者需要什么样的小人
  9. this.builder = builder;
  10. }
  11. // 根据用户的选择建造小人
  12. public void createPerson(){
  13. builder.buildHead();
  14. builder.buildBody();
  15. builder.buildArmLeft();
  16. builder.buildArmRight();
  17. builder.buildLegLeft();
  18. builder.buildLegRight();
  19. }
  20. }

测试

  1. public class Test {
  2. public static void main(String[] args) {
  3. Person person = new Person();
  4. PersonDirector thinDirector = new PersonDirector(new PersonThinBuilder(person));
  5. thinDirector.createPerson();
  6. System.out.println();
  7. PersonDirector fatDirector = new PersonDirector(new PersonFatBuilder(person));
  8. fatDirector.createPerson();
  9. }
  10. }

测试结果

  1. 瘦人类2
  2. 身体 左手 右手 左脚 右脚
  3. 胖人类2
  4. 身体 左手 右手 左脚 右脚

此时如果需要增加一个高个子和矮个子的小人,应该怎么做?
加两个类,一个高个子类和一个矮个子类,都继承 PersonBuilder ,然后客户端调用即可。

总结

  • 主要是用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化
  • 建造者模式的好处就是使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了
  • 建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式

原文链接:http://www.cnblogs.com/call-me-devil/p/11221101.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号