介绍
建造者模式(Builder Pattern),是创造性模式之一,Builder 模式的目的则是为了将对象的构建与展示分离。Builder 模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程。
使用场景
- 相同的方法,不同的执行顺序,产生不同的事件结果时
- 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时
- 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适。
UML类图
建造者(Builder)模式类图角色介绍
- Product 产品类 : 产品的抽象类;
- Builder : 抽象类, 规范产品的组建,一般是由子类实现具体的组件过程;
- ConcreteBuilder: 具体的构建器;
- Director:统一组装过程(可省略)
Builder模式简单实现
Builder模式最典型的例子,就是组装电脑的例子了
创建产品类
public class Computer {
private String cpu;
private String ram;
public String getCpu() {
return cpu;
}
public void setCpu(String cpu) {
this.cpu = cpu;
}
public String getRam() {
return ram;
}
public void setRam(String ram) {
this.ram = ram;
}
}
创建Builder类: 组装电脑有一套组装方法的模版,就是一个抽象的Builder类,里面提供了安装CPU、内存的方法,以及组装成电脑的create方法
public interface Builder {
public void buildCpu(String cpu);
public void buildRam(String ram);
public Computer create();
}
实现了抽象的Builder类,ComputerBuilder类用于组装电脑:
public class ComputerBuilder implements Builder{
private Computer computer = new Computer();
@Override
public void buildCpu(String cpu) {
computer.setCpu(cpu);
}
@Override
public void buildRam(String ram) {
computer.setRam(ram);
}
@Override
public Computer create() {
return computer;
}
}
客户端调用指挥者类
最后商家用指挥者类组装电脑。我们只需要提供我们想要的CPU,内存就可以了,至于商家怎样组装的电脑我们无需知道。
public class Client {
public static void main(String[] args) {
Builder builder = new ComputerBuilder();
Director director = new Director(builder);
//组装电脑
Computer computer = director.createComputer("i5-3210","DDR4");
System.out.println(">>>>cpu:"+computer.getCpu()+
" ram:"+computer.getRam());
}
}
运行结果:
>>>>cpu:i5-3210 ram:DDR4
Builder模式变种(常用)
通过静态内部类等方式实现的零件无序话构造:
public class Computer {
private String cpu;
private String ram;
public String getCpu() {
return cpu;
}
public void setCpu(String cpu) {
this.cpu = cpu;
}
public String getRam() {
return ram;
}
public void setRam(String ram) {
this.ram = ram;
}
public static class Builder {
private Computer computer = new Computer();
public Builder setCpu(String cpu) {
computer.setCpu(cpu);
return this;
}
public Builder setRam(String ram) {
computer.setRam(ram);
return this;
}
public Computer create() {
return computer;
}
}
}
客户端调用
public class Client {
public static void main(String[] args) {
Computer.Builder builder = new Computer.Builder();
Computer computer = builder.setCpu("i5-3210")
.setRam("DDR4").create();
System.out.println(">>>>cpu:"+computer.getCpu()+
" ram:"+computer.getRam());
}
}
运行结果:
>>>>cpu:i5-3210 ram:DDR4
总结
- 定义一个静态内部类Builder,内部的成员变量和外部类一样
Builder类通过一系列的方法用于成员变量的赋值,并返回当前对象本身(this)。 - Builder类提供一个build方法或者create方法用于创建对应的外部类,该方法内部调用了外部类的一个私有构造函数,该构造函数的参数就是内部类Builder。
- 外部类提供一个私有构造函数供内部类调用,在该构造函数中完成成员变量的赋值,取值为Builder对象中对应的值。
网友评论