建造者模式

建造者模式是将复杂对象的构建表示进行分离,让同样的构建过程可以创建出不同的表示。

比如,一个人的类,有三个属性:头、身体和脚。

我们通过建造者模式将构建三个身体部位的动作分离开,那么,对这三个身体部位有任意一个部位构造方法不同,都会表示出不同的人来,这就是所谓的对负责对象的构建和表示进行分离的思想。

在建造者模式下,有四个角色:product(产品类,以上的例子指的是人这个类)、抽象建造者、建造者和导演类。功能如下:

  • 产品类:一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量。在本类图中,产品类是一个具体的类,而非抽象类。实际编程中,产品类可以是由一个抽象类与它的不同实现组成,也可以是由多个抽象类与他们的实现组成。
  • 抽象建造者:引入抽象建造者的目的,是为了将建造的具体过程交与它的子类来实现。这样更容易扩展。一般至少会有两个抽象方法,一个用来建造产品,一个是用来返回产品。
  • 建造者:实现抽象类的所有未实现的方法,具体来说一般是两项任务:组建产品;返回组建好的产品。
  • 导演类:负责调用适当的建造者来组建产品,导演类一般不与产品类发生依赖关系,与导演类直接交互的是建造者类。一般来说,导演类被用来封装程序中易变的部分。

代码实现:

Product:

public class Person {
  private String head;
  private String body;
  private String foot;
  public String getHead() {
  return head;
  }
  public void setHead(String head) {
  this.head = head;
  }
  public String getBody() {
  return body;
  }
  public void setBody(String body) {
  this.body = body;
  }
  public String getFoot() {
  return foot;
  }
  public void setFoot(String foot) {
  this.foot = foot;
  }
}

Builder:

public interface PersonBuilder {
  void buildHead();
  void buildBody();
  void buildFoot();
  Person buildPerson();
}
//具体建造工具
ConcreteBuilder
public class ManBuilder implements PersonBuilder {
  Person person;
  public ManBuilder() {
  person = new Person();
  }
  public void buildbody() {
  person.setBody("建造男人的身体");
  }
  public void buildFoot() {
  person.setFoot("建造男人的脚");
  }
  public void buildHead() {
  person.setHead("建造男人的头");
  }
  public Person buildPerson() {
  return person;
  }
}

导演类

Director

public class PersonDirector {
public Person constructPerson(PersonBuilder pb) {
  pb.buildHead();
  pb.buildBody();
  pb.buildFoot();
  return pb.buildPerson();
  }
}

测试:

public class Test{
public static void main(String[] args) {
  PersonDirector pd = new PersonDirector();
  Person person = pd.constructPerson(new ManBuilder());
  System.out.println(person.getBody());
  System.out.println(person.getFoot());
  System.out.println(person.getHead());
  }
}

运行结果:

建造男人的身体
建造男人的脚
建造男人的头

  

posted @ 2017-11-20 13:57  K_artorias  阅读(215)  评论(0编辑  收藏  举报