(转)Java设计模式之建造者模式

来源:互联网 发布:2017双十一数据 编辑:程序博客网 时间:2024/05/18 10:35

原地址:http://blog.csdn.net/jason0539/article/details/44992733


本文继续介绍23种设计模式系列之建造者模式。

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

实用范围
1、当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
2、当构造过程必须允许被构造的对象有不同表示时。

角色
在这样的设计模式中,有以下几个角色:
1、Builder:为创建一个产品对象的各个部件指定抽象接口。
2、ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。
3、Director:构造一个使用Builder接口的对象,指导构建过程。
4、Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

角色Builder:
[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. public interface PersonBuilder {  
  2.      void buildHead();  
  3.      void buildBody();  
  4.      void buildFoot();  
  5.      Person buildPerson();  
  6. }  

角色ConcreteBuilder:
[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. public class ManBuilder implements PersonBuilder {  
  2.      Person person;  
  3.      public ManBuilder() {  
  4.           person = new Man();  
  5.      }  
  6.      public void buildbody() {  
  7.           person.setBody("建造男人的身体");  
  8.      }  
  9.      public void buildFoot() {  
  10.           person.setFoot("建造男人的脚");  
  11.      }  
  12.      public void buildHead() {  
  13.           person.setHead("建造男人的头");  
  14.      }  
  15.      public Person buildPerson() {  
  16.           return person;  
  17.      }  
  18. }  

角色ConcreteBuilder:
[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. public class WomanBuilder implements PersonBuilder {  
  2.      Person person;  
  3.      public WomanBuilder() {  
  4.           person = new Woman();  
  5.      }  
  6.      public void buildbody() {  
  7.           person.setBody(“建造女人的身体");  
  8.      }  
  9.      public void buildFoot() {  
  10.           person.setFoot(“建造女人的脚");  
  11.      }  
  12.      public void buildHead() {  
  13.           person.setHead(“建造女人的头");  
  14.      }  
  15.      public Person buildPerson() {  
  16.           return person;  
  17.      }  
  18. }  

角色Director:
[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. public class PersonDirector {  
  2.      public Person constructPerson(PersonBuilder pb) {  
  3.           pb.buildHead();  
  4.           pb.buildBody();  
  5.           pb.buildFoot();  
  6.           return pb.buildPerson();  
  7.      }  
  8. }  

角色Product:
[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. public class Person {  
  2.      private String head;  
  3.      private String body;  
  4.      private String foot;  
  5.   
  6.      public String getHead() {  
  7.           return head;  
  8.      }  
  9.      public void setHead(String head) {  
  10.           this.head = head;  
  11.      }  
  12.      public String getBody() {  
  13.           return body;  
  14.      }  
  15.      public void setBody(String body) {  
  16.           this.body = body;  
  17.      }  
  18.      public String getFoot() {  
  19.           return foot;  
  20.      }  
  21.      public void setFoot(String foot) {  
  22.           this.foot = foot;  
  23.      }  
  24. }  
  25. public class Man extends Person {  
  26.      public Man(){  
  27.           System.out.println(“开始建造男人");  
  28.      }  
  29. }  
  30. public class Woman extends Person {  
  31.      public Woman(){  
  32.           System.out.println(“开始建造女人");  
  33.      }  
  34. }  

测试:
[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. public class Test{  
  2.      public static void main(String[] args) {  
  3.           PersonDirector pd = new PersonDirector();  
  4.           Person womanPerson = pd.constructPerson(new ManBuilder());  
  5.           Person manPerson = pd.constructPerson(new WomanBuilder());  
  6.      }  
  7. }  

建造者模式在使用过程中可以演化出多种形式:
如果具体的被建造对象只有一个的话,可以省略抽象的Builder和Director,让ConcreteBuilder自己扮演指导者和建造者双重角色,甚至ConcreteBuilder也可以放到Product里面实现。
在《Effective Java》书中第二条,就提到“遇到多个构造器参数时要考虑用构建器”,其实这里的构建器就属于建造者模式,只是里面把四个角色都放到具体产品里面了。

上面例子如果只制造男人,演化后如下:
[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. public class Man {  
  2.      private String head;  
  3.      private String body;  
  4.      private String foot;  
  5.   
  6.      public String getHead() {  
  7.           return head;  
  8.      }  
  9.      public void setHead(String head) {  
  10.           this.head = head;  
  11.      }  
  12.      public String getBody() {  
  13.           return body;  
  14.      }  
  15.      public void setBody(String body) {  
  16.           this.body = body;  
  17.      }  
  18.      public String getFoot() {  
  19.           return foot;  
  20.      }  
  21.      public void setFoot(String foot) {  
  22.           this.foot = foot;  
  23.      }  
  24. }  

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. public class ManBuilder{  
  2.      Man man;  
  3.      public ManBuilder() {  
  4.           man = new Man();  
  5.      }  
  6.      public void buildbody() {  
  7.           man.setBody("建造男人的身体");  
  8.      }  
  9.      public void buildFoot() {  
  10.           man.setFoot("建造男人的脚");  
  11.      }  
  12.      public void buildHead() {  
  13.           man.setHead("建造男人的头");  
  14.      }  
  15.      public Man builderMan() {  
  16.           buildHead();  
  17.           buildBody();  
  18.           buildFoot();  
  19.           return man;  
  20.      }  
  21. }  

测试:
[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. public class Test{  
  2.      public static void main(String[] args) {  
  3.           ManBuilder builder = new ManBuilder();  
  4.           Man man = builder.builderMan();  
  5.      }  
  6. }  

更多设计模式:23种设计模式系列


作者:jason0539

博客:http://blog.csdn.net/jason0539(转载请说明出处)


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 7个月的婴儿厌食怎么办 小孩记忆不好读书记不住怎么办 9岁儿童不爱睡觉怎么办 6岁儿童不爱吃饭怎么办 2岁半宝宝不吃饭怎么办 一年级的孩子不爱学习怎么办 小孩不爱写作业怎么办啊 孩子不爱看书怎么办如何教育 2岁宝宝不爱看书怎么办 儿媳妇比儿子年龄大我不喜欢怎么办 不喜欢儿子却生了儿子怎么办 静不下心来看书怎么办 孩子爱玩不爱学怎么办 孩子爱玩不爱学习怎么办 孩子爱玩手机不爱学习怎么办 照四维宝宝太活泼了怎么办 胎宝宝太活泼了怎么办 7个月宝宝太活泼怎么办 我是个初中生不想上学怎么办 3岁宝宝不肯说话怎么办 两周宝宝不爱吃饭怎么办 小孩不喜欢吃水果蔬菜怎么办 孩子对学习不感兴趣怎么办 幼儿园老师不喜欢我孩子怎么办 孩子数学不主动思考问题怎么办 孩子做事慢磨蹭家长应该怎么办 孩子不写作业怎么办啊 对孩子在校被欺怎么办 二年级的孩子不爱学习怎么办 孩子不爱学习怎么办二年级 二年级孩子不爱写作业怎么办 孩子喜欢的朋友家长不喜欢怎么办? 孩子不喜欢上幼儿园家长怎么办 孩子不喜欢家长学佛怎么办呢? 学生家长讨厌老师老师该怎么办 孩子不爱去幼儿园总是哭怎么办 孩子学习一点都不主动怎么办 孩子怕老师不想上学怎么办 幼儿园孩子怕老师不想上学怎么办 孩子在幼儿园怕老师怎么办 幼儿园老师对孩子有歧视怎么办