浅谈Java设计模式——建造者模式(Builder)
一、概述
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式将复杂产品的构建过程封装分解在不同的方法中,使得创建过程非常清晰,能够让我们更加精确的控制复杂产品对象的创建过程,同时它隔离了复杂产品对象的创建和使用,使得相同的创建过程能够创建不同的产品。但是如果某个产品的内部结构过于复杂,将会导致整个系统变得非常庞大,不利于控制,同时若几个产品之间存在较大的差异,则不适用建造者模式,毕竟这个世界上存在相同点大的两个产品并不是很多,所以它的使用范围有限
二、使用场景
1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
2.当构造过程必须允许被构造的对象有不同的表示时。
3.适用于那些产品对象的内部结构比较复杂。
三、参与者
1.Product 表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程。 包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
2.Builder 抽象建造者,为创建一个Product对象的各个部件指定抽象接口。
3.ConcreteBuilder 实现Builder的接口以构造和装配该产品的各个部件。 定义并明确它所创建的表示。 提供一个检索产品的接口。
4.Director 指挥者类,构造一个使用Builder接口的对象。
四、类图
五、代码示例
1.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;
}
@Override
public String toString() {
return "Person{" +
"head='" + head + '\'' +
", body='" + body + '\'' +
", foot='" + foot + '\'' +
'}';
}
}
2.Builder 抽象建造者。
/**
* 对象构造接口,约束行为
* @author zhipeng_Tong
*/
public interface PersonBuilder {
void buildHead(); // 构建头
void buildBody(); // 构建身体
void buildFoot(); // 脚
Person getPerson(); // 获取
}
3.ConcreteBuilder 实现Builder的接口以构造和装配该产品的各个部件。
public class PersonThinBuilder implements PersonBuilder {
private Person person;
public PersonThinBuilder() {
person = new Person();
}
@Override
public void buildHead() {
person.setHead("头部");
}
@Override
public void buildBody() {
person.setBody("瘦瘦的身体");
}
@Override
public void buildFoot() {
person.setFoot("脚");
}
@Override
public Person getPerson() {
return person;
}
}
public class PersonFatBuilder implements PersonBuilder {
private Person person;
public PersonFatBuilder() {
person = new Person();
}
@Override
public void buildHead() {
person.setHead("头部");
}
@Override
public void buildBody() {
person.setBody("胖胖的身体");
}
@Override
public void buildFoot() {
person.setFoot("脚部");
}
@Override
public Person getPerson() {
return person;
}
}
4.Director 指挥者类。
public class PersonDirector {
public Person constructPerson(PersonBuilder builder) {
builder.buildHead();
builder.buildBody();
builder.buildFoot();
Person person = builder.getPerson();
return person;
}
}
测试代码:
public class Client {
public static void main(String[] args) {
PersonDirector director = new PersonDirector();
PersonThinBuilder ptb = new PersonThinBuilder();
Person person = director.constructPerson(ptb);
System.out.println(person);
PersonFatBuilder pfb = new PersonFatBuilder();
Person person1 = director.constructPerson(pfb);
System.out.println(person1);
}
}
Person{head='头部', body='瘦瘦的身体', foot='脚'}
Person{head='头部', body='胖胖的身体', foot='脚部'}