一,Builder模式介绍
Builder模式是一步一步创建一个复杂对象的创建型模式,它允许使用者在不知道内部建造细节的情况下,可以更精细的控制对象的构造流程。该模式是为了将构建复杂对象的过程和它的部件解耦,是的构建过程和不见得表示隔离开来。
因为一个复杂的对象有很多大量组成部分,如电脑,有主机,显示器,操作系统,还有各种小零件等,如何将这些不见组建成一台电脑,这个装配过程很漫长,也很复杂,为了在构建过程中对外部隐藏实现细节,就可以使用Builder模式将部件和组装过程分离,使得构建过程和部件都可以自由扩展,两者之间的耦合也降到最低。
二,Builder模式的定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
三,Builder模式的使用场景
(1)相同的方法,不同的执行顺序,产生不同的事件结果。
(2)对各部件或零件,都可以配到一个对象中,但是产生的运行结果又不相同时。
(3)产品类非常复杂,或者产品类中的调用顺序不同产生了不同的结果,这个时候使用创建者模式非常合适。
(4)当初始化一个对象特别复杂,如参数多,且很多参数都有默认值时。
四,Builder模式的UML类图
五,Builder模式简单实例
(1)电脑的抽象类
public abstract class Computer {protected String board;
protected String display;
protected String os;
//构造方法
protected Computer(){
}
//设置主板
protected void setBoard(String board){
this.board = board;
}
//设置显示器
protected void setDisplay(String display){
this.display = display;
}
//设置操作系统
protected abstract void setOs();
public String toString() {
return "computer[board="+board+",display="+display+",os="+os+"]";
}
}
(2)具体的苹果电脑类,macBook
public class MacBook extends Computer {
protected MacBook() {
}
protected void setOs() {
os = "Mac OS X 10.10";
}
}
(3)抽象Builder类
public abstract class Builder {
// 设置主机
public abstract void builderBoard(String board);
// 设置显示器
public abstract void builderDisplay(String display);
// 设置操作系统
public abstract void buildOS();
// 创建Computer
public abstract Computer create();
}
(4)具体的Builder类 MacBookBuilder
public class MacBookBuilder extends Builder {
private Computer computer = new MacBook();
public void builderBoard(String board) {
// TODO Auto-generated method stub
computer.setBoard(board);
}
public void builderDisplay(String display) {
// TODO Auto-generated method stub
computer.setDisplay(display);
}
public Computer create() {
// TODO Auto-generated method stub
return computer;
}
public void buildOS() {
computer.setOs();
}
}
(5)Director类,负责构造电脑Computer
public class Director {
Builder builder = null;
public Director(Builder builder){
this.builder = builder;
}
public void construct(String board,String display){
builder.builderBoard(board);
builder.builderDisplay(display);
builder.buildOS();
}
}
(6)测试Test类
public class Test {
public static void main(String args[]){
//构造器
Builder builder = new MacBookBuilder();
Director pcDirector = new Director(builder);
//封装构建过程
pcDirector.construct("intel主板", "三星显示器");
//输出信息
System.out.println(builder.create().toString());
}
}
(7)测试结果
六:总结
(1),良好的封装性,不必知道内部组成的细节。
(2),建造者独立,容易扩展。
(3),产生多余的builder对象以及director对象,消耗内存。