1. 什么是建造者模式
建造者模式定义:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
建造者模式包括的角色:
(1)Builder:给出一个抽象接口或抽象类,以规范产品的建造。
这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建,一般由子类具体实现。
(2)ConcreteBuilder:Builder接口的实现类,并返回组建好对象实例。
(3)Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,
只负责保证对象各部分完整创建或按某种顺序创建。
(4)Product:要创建的复杂对象,产品类。
建造者模式的使用场景:
(1)当产品有复杂的内部构造时(参数很多)。
(2)需要生产的产品的属性相互依赖,这些属性的赋值顺序比较重要时
(因为在调用ConcreteBuilder的赋值方法时是有先后顺序的)。
2. 建造者角色分析:
建造者模式主要包含四个角色:
抽象建造者(Builder): 它声明为创建一个产品对象的各个部件指定的抽象接口,在该接口中一般声明两类方法,一类方法是buildPartX(),它们用于创建复杂对象的各个部件;另一类方法是getResult(),它们用于返回复杂对象。Builder既可以是抽象类,也可以是接口,
具体建造者(MyBuilder): 实现抽象建造者接口,构建和装配各个部件,定义并明确它所创建的复杂对象,也可以提供一个方法返回创建好的复杂产品对象。
指挥者(Director): 它负责安排复杂对象的建造次序,指挥者与抽象建造者之间存在关联关系,可以在其construct()建造方法中调用建造者对象的部件构造与装配方法,完成复杂对象的建造。客户端一般只需要与指挥者进行交互,在客户端确定具体建造者的类型,并实例化具体建造者对象(也可以通过配置文件和反射机制) ,然后通过指挥者类的构造函数或者Setter方法将该对象传入指挥者类中。它主要是用于创建一个复杂的对象,它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程。
产品(Product): 产品角色,一个具体的产品对象。
3. 代码如下:
抽象建造者
/**
* 抽象建造者
*/
public abstract class Builder {
protected Product product = null;
// 创建复杂对象的各个部件
public abstract void buildPartA();
public abstract void buildPartB();
// 所谓的复杂对象 new (创建对象默认调用无参构造函数)
public Builder() {
System.out.println("Product 即将创建");
product = new Product();
}
// 返回复杂对象
public Product getResult() {
return product;
}
}
具体建造者:
/**
* 具体建造者, 实现抽象建造者接口
*/
public class MyBuilder extends Builder{
// 构建和装配各个部件
@Override
public void buildPartA() {
System.out.println("MyBuilder buildPartA");
}
@Override
public void buildPartB() {
System.out.println("MyBuilder buildPartB");
}
}
产品:
/**
* 产品
*/
public class Product {
private String partA;
private String partB;
}
指挥者:
/**
* 指挥者(Director) 安排复杂对象的建造次序
*/
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
// 调用建造者对象的部件构造与装配方法
public Product construct() {
builder.buildPartA();
builder.buildPartB();
return builder.getResult();
}
}
测试类:
/**
* 测试类
*/
public class Test {
public static void main(String[] args) {
Builder builder = new MyBuilder();
Director director = new Director(builder);
Product product = director.construct();
System.out.println(product);
}
}
end