Builder模式
一、简介
建造者模式(builder)是创建一个复杂对象的创建型模式,将构建复杂对象的过程和它的部件解耦,使得构建过程和部件的表示分离开来。
二、Builder模式的简单实现
以计算机组装的过程简化为例,这里把计算机的组装简化为3部分:构建主机、设置操作系统、设置显示器。然后通过Director和具体的Builder来构造计算机对象。
//抽象产品类
public abstract class Computer{
protected String mBoard;
protected String mDisplay;
protected String mOs;
public void setmBoard(String mBoard) {
this.mBoard = mBoard;
}
public void setmDisplay(String mDisplay) {
this.mDisplay = mDisplay;
}
public void setmOs(String mOs) {
this.mOs = mOs;
}
}
//抽象Builder
public abstract class Builder{
public abstract void buildBoard(String Board);
public abstract void buildDisplay(String Display);
public abstract void buildOs(String Os);
public abstract Computer create();
}
//具体产品
public class MacComputer extends Computer{
}
//具体Builder
public class MacComputerBuilder extends Builder{
Computer computer=new MacComputer();
@Override
public void buildBoard(String Board) {
computer.setmBoard(Board);
}
@Override
public void buildDisplay(String Display) {
computer.setmDisplay(Display);
}
@Override
public void buildOs(String Os) {
computer.setmOs(Os);
}
@Override
public Computer create() {
return computer;
}
}
//Director负责统一组装
public class Director{
Builder builder=null;
public Director(Builder builder) {
this.builder = builder;
}
public void construct(String board ,String dispaly,String os){
builder.buildBoard(board);
builder.buildDisplay(dispaly);
builder.buildOs(os);
}
}
//使用
public Computer Test(){
Builder builder=new MacComputerBuilder();
Director director=new Director(builder);
director.construct("appale","显示器","macos");
return builder.create();
}
需要说明的是在实际开发过程中并不是采用上述方式,其中Director会被省略,组装直接使用Builder且该Builder通常为链式调用。
三、使用建造者模式的场景和优缺点
使用场景
- 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
- 相同的方法,不同的执行顺序,产生不同的事件结果时。
- 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时。
- 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能。
- 创建一些复杂的对象时,这些对象的内部组成构件间的建造顺序是稳定的,但是对象的内部组成构件面临着复杂的变化。
优点
- 使用建造者模式可以使客户端不必知道产品内部组成的细节。
- 具体的建造者类之间是相互独立的,容易扩展。
- 由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。
四、Android源码中的Builder模式实现
Android中很多对象的创建都采用了Builder模式比较常用的就是AlertDialog.Builder
参考《Android源码设计模式解析与实战》