建造者模式(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、当初始化一个对象特别复杂,比如参数比较多,且很多参数都具有默认值的时候。 建造者模式包括的角色: (1)Builder:给出一个抽象接口或抽象类,以规范产品的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建,一般由子类具体实现。 (2)ConcreteBuilder:Builder接口的实现类,并返回组建好对象实例。 (3)Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。 (4)Product:要创建的复杂对象,产品类。 代码实现: 1、product 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对象,消耗了内存。
|
|