这里我们先来声明一下,建造者模式(Builder)也叫生成器模式,也就是说他们两个只是在叫法上稍有不同,指向的其实是一种模式,这个大家了解一下就好,建造者模式将一个复杂的对象的构建与它的表示相分离,使得同样的构建过程可以创建不同的表示,具体来说就是,它将客户端与包含多个组件部分的复杂对象的创建过程分离,客户端无需知道复杂对象的内部组成部分与装配方式,只需要知道所需建造者的类型即可,它关注如何一步一步创建一个复杂的对象,不同的具体建造者定义了不同的创建过程,且具体建造者相互独立,这样增加新的建造者就显得非常方便,无须修改已有代码,使系统具有较好的扩展性,这也是设计模式的一种常用思想,接下来我们就来具体看看建造者模式
一、定义
建造者模式将一个复杂的对象的构建与它的表示相分离,使得同样的构建过程可以创建不同的表示
二、使用场景
- 当构造过程必须允许被构造对象有不同的表示时
- 相同的方法,不同的执行顺序,产生不同结果时
- 将多个零部件装配到一个对象中
- 当初始化一个对象特别复杂,如参数多,且很多参数都具有默认值时
三、模型图
四、Builder 模式的简单实现
这里我们也采用大家通用且特别容易理解的组装电脑这个复杂过程来讲述,计算机的组装过程较为复杂,并且组装顺序也是不固定的,为了便于理解,我们把计算机的组装过程简化为构建主机,设置操作系统,设置显示器 3 个部分,然后通过 Director 和具体的 Builder 来构建计算机对象
1. 计算机抽象类,即 Product 角色
/**
* 计算机抽象类,即 Product 角色
*
* @author qiudengjiao
*/
public class Computer {
protected String mHost;
protected String mDisplay;
protected String mOS;
public Computer() {
}
/**
* 设置主机
*
* @param host
*/
public void setHost(String host) {
this.mHost = host;
}
/**
* 设置显示器
*
* @param display
*/
public void setDisplay(String display) {
this.mDisplay = display;
}
/**
* 设置操作系统
*
* @param OS
*/
public void setOS(String OS) {
this.mOS = OS;
}
@Override
public String toString() {
return "Computer [mHost=" + mHost + ", mDisplay=" + mDisplay + ", mOS=" + mOS + "]";
}
}
2. 创建 Builder 类
这里提供了一套模板,提供了设置主机,显示器,操作系统的方法,以及组装成电脑的 create() 方法
/**
* 抽象Builder类
*
* @author qiudengjiao
*/
public abstract class Builder {
//设置主机
public abstract void buildHost(String host);
//设置显示器
public abstract void buildDisplay(String display);
//设置操作系统
public abstract void buildOS(String OS);
//创建Computer
public abstract Computer create();
}
3. 实现了抽象的 Builder 类,ComputerBuilder 类用于组装电脑:
/**
* 实现了抽象的Builder类,ComputerBuilder类用于组装电脑
*
* @author qiudengjiao
*/
public class ComputerBuilder extends Builder {
private Computer mComputer = new Computer();
@Override
public void buildHost(String host) {
mComputer.setHost(host);
}
@Override
public void buildDisplay(String display) {
mComputer.setDisplay(display);
}
@Override
public void buildOS(String OS) {
mComputer.setOS(OS);
}
@Override
public Computer create() {
return mComputer;
}
}
4. Director类 负责构造 Computer
/**
* Director类,负责构造 Computer
*
* @author qiudengjiao
*
*/
public class Director {
Builder mBuilder = null;
public Director(Builder builder) {
this.mBuilder = builder;
}
/**
* 构建对象
*
* @param host
* @param display
* @param OS
* @return
*/
public Computer construct(String host, String display, String OS) {
this.mBuilder.buildHost(host);
this.mBuilder.buildDisplay(display);
this.mBuilder.buildOS(OS);
return mBuilder.create();
}
}
5. 到这里我们就能来组装我们的电脑了
/**
* 测试电脑组装类
*
* @author qiudengjiao
*/
public class CreatComputer {
public static void main(String[] args) {
Builder mBuilder = new ComputerBuilder();
Director mDirecror = new Director(mBuilder);
// 组装电脑
mDirecror.construct("联想", "三星显示器", "OS系统");
System.out.println(mBuilder.create().toString());
}
}
6. 我们来看一下打印情况
今天就写到这里,我们只是比较简单的介绍了下建造者模式的构建流程,更多详细深入的理解还需要大家去看源码中的使用,但是道理都是一样的