一:使用场景
1)使用到的地方:如果你想创建类似汽车这样的对象,首先要创建轮子,玻璃,桌椅,发动机,外廓等,这些部件都创建好后,最后创建汽车成品,部件的创建和汽车的组装过程本身都很复杂的情况,希望把部件的创建和成品的组装分开来做,这样把要做的事情分割开来,降低对象实现的复杂度,也降低以后成本的维护,把汽车的部件创建和组装过程独立出两个对应的工厂来做,有点类似建立两个对应的部件创建工厂和汽车组装工厂两个工厂,而工厂只是创建一个成品,并没有把里面的步骤也独立出来,应该说Builder模式比工厂模式又进了一步。
2)采用Builder模式后的好处:把一个负责的对象的创建过程分解,把一个对象的创建分成两个对象来负责创建,代码更有利于维护,可扩性比较好。
3)采用Builder模式后的坏处:实现起来,对应的接口以及部件的对象的创建比较多,代码相对来讲,比较多了,估计刚开始你会有点晕,这个可以考虑代码精简的问题,增加代码的可读性。
二:一个实际的例子
汽车的组装
1)首先创建汽车这个成品对象,包含什么的成员
public class Car implements Serializable{
/**
* 汽车序列号
*/
private static final long serialVersionUID = 1L;
/**汽车轮子*/
private Wheel wheel;
/**汽车发动机*/
private Engine engine;
/**汽车玻璃*/
private Glass glass;
/**汽车座椅*/
private Chair chair;
public Wheel getWheel() {
return wheel;
}
public void setWheel(Wheel wheel) {
this.wheel = wheel;
}
public Engine getEngine() {
return engine;
}
public void setEngine(Engine engine) {
this.engine = engine;
}
public Glass getGlass() {
return glass;
}
public void setGlass(Glass glass) {
this.glass = glass;
}
public Chair getChair() {
return chair;
}
public void setChair(Chair chair) {
this.chair = chair;
}
}
2)创建对应汽车零部件
public class Wheel {
public Wheel(){
print("--汽车轮子构建完毕--");
}
}
public class Engine {
public Engine(){
print("--汽车发动机构建完毕--");
}
}
public class Glass {
public Glass(){
print("--汽车玻璃构建完毕--");
}
}
public class Chair {
public Chair(){
print("--汽车座椅构建完毕--");
}
}
3)开始重点了,汽车成品的组装过程
public interface Builder {
/**组装汽车轮子*/
public void buildWheel();
/**组装汽车发动机*/
public void buildEngine();
/**组装汽车玻璃*/
public void buildGlass();
/**组装汽车座椅*/
public void buildChair();
/**返回组装好的汽车*/
public Car getCar();
}
以及实现类
public class CarBuilder implements Builder {
/**汽车成品*/
private Car car;
public CarBuilder(){
car=new Car();
}
/**组装汽车轮子*/
@Override
public void buildChair() {
car.setChair(new Chair());
}
/**组装汽车发动机*/
@Override
public void buildEngine() {
car.setEngine(new Engine());
}
/**组装汽车玻璃*/
@Override
public void buildGlass() {
car.setGlass(new Glass());
}
/**组装汽车座椅*/
@Override
public void buildWheel() {
car.setWheel(new Wheel());
}
/**返回组装好的汽车*/
@Override
public Car getCar() {
buildChair();
buildEngine();
buildGlass();
buildWheel();
print("--整个汽车构建完毕--");
return car;
}
}
4)最后汽车创建测试
public static void main(String[] args) {
/**创建汽车组装*/
Builder carBuilder=new CarBuilder();
Car car=carBuilder.getCar();
}
最后输出:
--汽车座椅构建完毕--
--汽车发动机构建完毕--
--汽车玻璃构建完毕--
--汽车轮子构建完毕--
--整个汽车构建完毕--
5)体会心得:Builder模式实际的重点就把汽车的组装过程和零部件的生产分开来实现,零部件的生成主要靠自己的对象来实现,我上面只是在构造函数里创建了,比较简单,而重点汽车的组装则交给CarBuilder来实现,最终由builder来先负责零部件的创建,最后返回出成品的汽车。