设计模式-建造者模式
建造者模式(Builder Pattern),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式一般适用于产品的构建过程比较稳定、客户不关心产品如何构建的场景。也就是说,建造者模式隐藏了产品的具体构建过程。一般来说,建造者模式由一个指挥者调用建造者来构建具体的产品,指挥者接受具体的建造者,从而创建不同种类的产品。
先看建造者模式类图:
UML类图
假设我们将电脑这一产品抽象为主机和显示器这两个部分,AbstractComputerBuilder
是建造者抽象基类,现在需要苹果电脑和联想电脑,那么可以通过两个具体创建者分别去创建,如AppleComputerBuilder
和LenovoComputerBuilder
。 Director
通过传递进来的具体构建者去创建特定的产品。
代码实现
产品类
/**
* <p>文件描述: 产品类</p>
*
* @Author luanmousheng
* @Date 17/6/29 下午9:42
*/
public class Computer {
private String host;
private String display;
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public String getDisplay() {
return display;
}
public void setDisplay(String display) {
this.display = display;
}
}
建造者模式抽象基类
/**
* <p>文件描述: 建造者抽象基类</p>
*
* @Author luanmousheng
* @Date 17/6/29 下午10:29
*/
public abstract class AbstractComputerBuilder {
protected Computer computer;
/**
* 构建主机
* @return
*/
public abstract AbstractComputerBuilder buildHost();
/**
* 构建显示器
* @return
*/
public abstract AbstractComputerBuilder buildDisplay();
/**
* 组合
* @return
*/
public abstract Computer build();
}
两个具体创建者类
/**
* <p>文件描述: 苹果电脑具体创建者类</p>
*
* @Author luanmousheng
* @Date 17/6/29 下午10:31
*/
public class AppleComputerBuilder extends AbstractComputerBuilder {
private String host;
private String display;
@Override
public AbstractComputerBuilder buildHost() {
this.host = "苹果主机";
return this;
}
@Override
public AbstractComputerBuilder buildDisplay() {
this.display = "苹果显示器";
return this;
}
@Override
public Computer build() {
this.computer = new Computer();
this.computer.setHost(this.host);
this.computer.setDisplay(this.display);
return this.computer;
}
}
/**
* 联想电脑具体创建者类
*/
public class LenovoComputerBuilder extends AbstractComputerBuilder {
private String host;
private String display;
@Override
public AbstractComputerBuilder buildHost() {
this.host = "联想主机";
return this;
}
@Override
public AbstractComputerBuilder buildDisplay() {
this.display = "联想显示器";
return this;
}
@Override
public Computer build() {
this.computer = new Computer();
computer.setHost(this.host);
computer.setDisplay(this.display);
return this.computer;
}
}
指挥者类
/**
* <p>文件描述: 指挥者类</p>
*
* @Author luanmousheng
* @Date 17/6/29 下午10:33
*/
public class Director {
/**
* 根据传进来的具体创建者类去创建产品
* @param computerBuilder
* @return
*/
public static Computer buildComputer(AbstractComputerBuilder computerBuilder) {
return computerBuilder.buildHost().buildDisplay().build();
}
}
Demo类
/**
* <p>文件描述: 建造者模式Demo类</p>
*
* @Author luanmousheng
* @Date 17/6/29 下午10:34
*/
public class BuilderPatternDemo {
public static void main(String[] args) {
AbstractComputerBuilder appleComputerBuilder = new AppleComputerBuilder();
Computer appleComputer = Director.buildComputer(appleComputerBuilder);
System.out.println(appleComputer.getHost());
System.out.println(appleComputer.getDisplay());
AbstractComputerBuilder lenovoComputerBuilder = new LenovoComputerBuilder();
Computer lenovoComputer = Director.buildComputer(lenovoComputerBuilder);
System.out.println(lenovoComputer.getHost());
System.out.println(lenovoComputer.getDisplay());
}
}
Demo类运行结果
苹果主机
苹果显示器
联想主机
联想显示器
总结
- 对于用户来说,不必关心具体建造细节。
- 建造过程是稳定的,产品的各个部分建造过程互不影响。
- 具体建造者之间是相互独立的,很容易扩展。
参考:
- 大话设计模式. 程杰著