建造型——建造者模式

来源:互联网 发布:北京上游网络 编辑:程序博客网 时间:2024/04/30 13:12

抽象工厂的缺点:

功能太简单,只能创建简单的对象。

定义:

将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,使用简单的对象一步一步构建一个复杂

的对象。


目的

将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

特点

①一个复杂的对象的创建,通常由各个部分的子对象用一定的算法构成;

 ②由于需求的变化,这个复杂的各个部分经常面临这剧烈的变化,但是他们组合在一起的算法却相对稳定。

 ③构建时将变与不变分离开。


通用类图:

产品类

一般是一个较为复杂的对象。可以是一个具体类,也可以是有一个抽象类和与他不同实现组成。

抽象建造者

为创建一个产品对象的各个部件指定抽象接口。一般有两类抽象方法,一个用来返回建造产品,一个用来返回产品。

建造者

实现建造各个部件的具体过程,并将返回组建好的产品。

导演类

负责调用适当的建造者来组建产品,导演类一般不与产品类发生依赖关系,与导演类直接交互的是建造者类,一般来说

导演类被用来封装程序中易变的部分。

客户端:

只需关系具体的建造者,无需关系产品内部构建流程,如果需要其他复杂的产品对象,只需选择其他的建造者,如果需要扩展

,则只需写一个新的Builder就行了。


角色Product:
[java] view plain copy
 print?
  1. public class Person {  
  2.      //产品部件
  3.  private String head;  
  4.      private String body;  
  5.      private String foot;  
  6.   
  7.      public String getHead() {  
  8.           return head;  
  9.      }  
  10.      public void setHead(String head) {  
  11.           this.head = head;  
  12.      }  
  13.      public String getBody() {  
  14.           return body;  
  15.      }  
  16.      public void setBody(String body) {  
  17.           this.body = body;  
  18.      }  
  19.      public String getFoot() {  
  20.           return foot;  
  21.      }  
  22.      public void setFoot(String foot) {  
  23.           this.foot = foot;  
  24.      }  
  25. }  


  1. public class Man extends Person {  
  2.      public Man(){  
  3.           System.out.println(“开始建造男人");  
  4.      }  
  5. }  
  6. public class Woman extends Person {  
  7.      public Woman(){  
  8.           System.out.println(“开始建造女人");  
  9.      }  
  10. }  

角色Builder:
[java] view plain copy
 print?
  1. public interface PersonBuilder {  
  2.     abstract void buildHead();  
  3.     abstract void buildBody();  
  4.     abstract void buildFoot();  
  5.     //返回产品函数
  6. abstract  Person buildPerson();  
  7. }  
建造者AConcreteBuilder:
[java] view plain copy
 print?
  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.     
  16.   //返回组建好的产品
  17.  public Person buildPerson() {  
  18.           return person;  
  19.      }  
  20. }  
建造者BConcreteBuilder:
[java] view plain copy
 print?
  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.     
  16. //返回组建后的产品
  17.  public Person buildPerson() {  
  18.           return person;  
  19.      }  
  20. }  
导演类Director:
[java] view plain copy
 print?
  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. }  
客户端:
[java] view plain copy
 print?
  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?
  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?
  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?
  1. public class Test{  
  2.      public static void main(String[] args) {  
  3.           ManBuilder builder = new ManBuilder();  
  4.           Man man = builder.builderMan();  
  5.      }  
  6. }  
建造者模式是的优点:
①使用建造者模式可以是客户端不必知道产品内部组成的细节
②具体的建造者类之间是相互独立的,对于系统的扩展非常有利。
③由于具体的建造者是独立的,因此可以建造过程逐步细化,而不对其他模块产生任何影响。


原创粉丝点击