分享

设计模式之创建者模式

 东西VS南北 2017-11-16

建造者模式Builder Pattern)(构造者模式)(生成者模式)

定义

Separate the construction of a complex object from its representation so that the same construction process can create different representations.

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

 

构建:一个对象的子元素或者是组成部分

人:头 、身体、胳膊、腿

表示:描述对象中构建部分或者描述对象的子元素是如何连起来的

人:头 圆的 在身体上面

身体 在中间

胳膊 在身体两侧

  在身体下方

主要解决了以下问题:

1、相同的方法,不同的执行顺序,产生不同的事件结果。

2、多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时候。

3、产品类型非常复杂,或者产品类中的调用顺序不同产生了不通的作用,这个时候建造者模式非常合适。

4、当初始化一个对象特别复杂,比如参数比较多,且很多参数都具有默认值的时候。

建造者模式包括的角色:

1Builder:给出一个抽象接口或抽象类,以规范产品的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建,一般由子类具体实现。

2ConcreteBuilderBuilder接口的实现类,并返回组建好对象实例。

3Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。

4Product:要创建的复杂对象,产品类。

 
 
 
 

 代码实现:

1product

   public class Person {

  //   身体 胳膊

  private String head;

  private String body;

  private String leg;

  private String arm;

 

  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 getLeg() {

    return leg;

  }

 

  public void setLeg(String leg) {

    this.leg = leg;

  }

 

  public String getArm() {

    return arm;

  }

 

  public void setArm(String arm) {

    this.arm = arm;

  }

 

}

2、Builder  提供人组成的抽象方法

public interface PersonBuilder {

 

  void buildHead();

 

  void buildBody();

 

  void buildLeg();

 

  void buildArm();

 

  Person buildPerson();

}

3、Builder接口的实现类

public class HumanBuilder implements PersonBuilder {

  private Person person;

 

  public HumanBuilder() {

    this.person = new Person();

  }

 

  @Override

  public void buildHead() {

    this.person.setHead("人类的头");

 

  }

 

  @Override

  public void buildBody() {

    this.person.setBody("人类的身体");

  }

 

  @Override

  public void buildLeg() {

    this.person.setLeg("人类的腿");

 

  }

 

  @Override

  public void buildArm() {

    this.person.setArm("人类的胳膊");

 

  }

 

  @Override

  public Person buildPerson() {

    return person;

  }

 

}

public class RobotBuilder implements PersonBuilder {

  private Person person;

 

  public RobotBuilder() {

    this.person = new Person();

  }

 

  @Override

  public void buildHead() {

 

    this.person.setHead("机器人的头");

  }

 

  @Override

  public void buildBody() {

    this.person.setBody("机器人的身体");

 

  }

 

  @Override

  public void buildLeg() {

    this.person.setLeg("机器人的腿");

 

  }

 

  @Override

  public void buildArm() {

    this.person.setArm("机器人胳膊");

 

  }

 

  @Override

  public Person buildPerson() {

    return person;

  }

 

}

4、Director

public class PersonDirector {

  public Person constructPerson(PersonBuilder pb) {

    pb.buildHead();

    pb.buildBody();

    pb.buildArm();

    pb.buildLeg();

    return pb.buildPerson();

  }

}

5、调用示例

public class BuildetTest {

  public static void main(String[] args) {

    PersonDirector pd = new PersonDirector();

    Person person = pd.constructPerson(new HumanBuilder());

    System.out.println(person.getHead() + " \n");

    System.out.println(person.getBody() + " \n");

    System.out.println(person.getArm() + " \n");

    System.out.println(person.getLeg() + " \n");

    Person robotPerson = pd.constructPerson(new RobotBuilder());

    System.out.println(robotPerson.getHead() + " \n");

    System.out.println(robotPerson.getBody() + " \n");

    System.out.println(robotPerson.getArm() + " \n");

    System.out.println(robotPerson.getLeg() + " \n");

  }

}

6、结果

 
 

建造模式的优缺点

建造者模式的优点:

1)建造模式是将复杂的内部创建封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,对于内部是如何建造成成品的,调用者无需关心,良好的封装性是建造者模式的优点之一。

2)建造者类逻辑独立,易拓展

 

建造者模式的缺点:

很明显产生了多余的Build对象以及Dirextor对象,消耗了内存。

 

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多