建造者模式:
将一个复杂对象的构建也它的表示分离,使得同样的构建过程可创建不同的表示。
创建者模式组成:
1、抽象建造者角色(Builder):为创建一个Product对象的各个部件指定的抽象类或接口。
2、具体建造者类(ConcreteBuilder):实现Builder接口,构造和装配各个部件。
3、产品角色(Product):产品角色类。
4、指挥者角色(Director):根据需求使用Builder接口的对象,用来指挥创建产品顺序。
建造者模式主要应用在规定建造顺序。比如我们盖楼房,不管是3层的小楼,还是30层的高楼,房屋内部各不相同,但第一步总是打地基,然后修框架等操作。建造模式就是解决这类情况:即流程不变,但流程的具体细节是会变化的。
代码实例:
现在要生成车,车暂时由引擎、车轮和外壳组成。组成工序是不变的。
// Builder角色
abstract public class Builder {
abstract public void Engine();
abstract public void Wheel();
abstract public void Shell();
}
// 宝马车建造者
public class BwmBuilder extends Builder {
@Override
public void Engine() {
// TODO Auto-generated method stub
System.out.println("建造宝马车引擎。");
}
@Override
public void Wheel() {
// TODO Auto-generated method stub
System.out.println("建造宝马车轮子。");
}
@Override
public void Shell() {
// TODO Auto-generated method stub
System.out.println("建造宝马车外壳。");
}
}
// 奔驰车建造者
public class BenzBuilder extends Builder {
@Override
public void Engine() {
// TODO Auto-generated method stub
System.out.println("建造奔驰车引擎。");
}
@Override
public void Wheel() {
// TODO Auto-generated method stub
System.out.println("建造奔驰车轮子。");
}
@Override
public void Shell() {
// TODO Auto-generated method stub
System.out.println("建造宝奔驰车外壳。");
}
}
// 指挥者类
public class Director {
private Builder builder = null;
public Director(Builder builder) {
// TODO Auto-generated constructor stub
this.builder = builder;
}
// 按预定顺序造车
public void CreateCar(){
builder.Engine();
builder.Wheel();
builder.Shell();
}
}
// 客户端
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
Builder builder = new BwmBuilder();
Builder builder2 = new BenzBuilder();
Director directorBwm = new Director(builder);
Director directorBenz = new Director(builder2);
directorBwm.CreateCar();
directorBenz.CreateCar();
}
}
分析:
首先,建造者模式的封装性很好。使用建造者模式可以有效的封装变化,在使用建造者模式的场景中,一般产品类和建造者类是比较稳定的,因此,将主要的业务逻辑封装在指挥类中对整体而言可以取得比较好的稳定性。
其次,建造者模式很容易进行扩展。如果有新的需求,通过实现一个新的建造者类就可以完成,基本上不用修改之前已经测试通过的代码,因此也就不会对原有功能引入风险。
另外,指挥者规定了建造产品的具体顺序,建造过程被约束,只能按照一定流程顺序建造。就像上列中客户端建造汽车只能先造引擎,然后是轮子,最后是汽车。