建造者模式是设计模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
实用范围
1 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
2 当构造过程必须允许被构造的对象有不同表示时。
角色
在这样的设计模式中,有以下几个角色:
1 builder:为创建一个产品对象的各个部件指定抽象接口。
2 ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并 提供一个检索产品的接口。
3 Director:构造一个使用Builder接口的对象。
4 Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
建造者模式UML图使用案例
假设一个人有姓名、年龄、身份ID属性组成,当我们创建一个人这个对象的时候,我们可能要考虑下面这些情况:
1、只希望指定姓名
2、只希望指定ID
3、只希望指定年龄
4、只希望指定年龄和ID
5、只希望指定姓名和年龄
6、只希望指定姓名和ID
如果按照传统的方式,Person类必须定义六个构造函数来对应不同情况,但是如果对象属性为100,那构造函数数量还是比较惊人的,当然我们不可能会继续那样干。这种情况,我们就可以用到今天介绍的主角了—建造者模式了。
Builder类
public interface Builder {
PersonBuilder setAge(int age);
PersonBuilder setId(String id);
PersonBuilder setName(String name);
Person create();
}
ConcreteBuilder类
public class PersonBuilder implements Builder {
private String id = "无id";
private String name = "无名字";
private int age = -1;
@Override
public PersonBuilder setAge(int age) {
this.age = age;
return this;
}
@Override
public PersonBuilder setId(String id) {
this.id = id;
return this;
}
@Override
public PersonBuilder setName(String name) {
this.name = name;
return this;
}
@Override
public Person create() {
return new Person(id, name, age);
}
}
Product类
public class Person {
private String id;
private String name;
private int age;
public Person(String id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
@Override
public String toString() {
return id+","+name+","+age;
}
}
Director类
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public void constructor(String id, String name, int age){
builder.setAge(age);
builder.setId(id);
builder.setName(name);
}
}
测试类
public class Test {
public static void main(String[] args) {
//不使用Director
Person person = new PersonBuilder()
.setName("aaa")
.setAge(18)
.setId("1222111").create();
System.out.println(person.toString());
//完整
Builder builder = new PersonBuilder();
Director director = new Director(builder);
director.constructor("110","小明", 19);
Person person1 = builder.create();
System.out.println(person1.toString());
}
}
输出结果
1222111,aaa,18
110,小明,19
扩展
建造者模式在使用过程中可以演化出多种形式:
1、省略抽象建造者角色
如果系统中只需要一个具体的建造者的话,可以省略掉抽象建造者。
2、省略指导者角色
在具体建造者只有一个的情况下,如果抽象建造者角色已经被省略掉,那么还可以省略掉指导者角色,让Builder自己扮演指导者和建造者双重角色。
(示例中已经给出了省略指导者角色的情况,另一种情况比较简单这里就不举例了,移除抽象类Person即可)
以上。
网友评论