1、场景
我们需要建造一个比较复杂的产品,如神舟飞船。这个产品创建起来非常的复杂,它肯定是由很多的零件先组成组件,然后组件再组成产品的,那么就会涉及到组件组装的顺序问题。
实际开发中,我们所需要的对象创建时,非常的复杂,有很多的步骤需要处理的时候。
2、建造者模式的本质
分离了对象子组件的单独构造(由Builder来负责)和装配(由Director负责)。从而可以构造出复杂的对象,这个模式适用于:某个对象的构建过程复杂的情况下使用。
由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象。相同的构建器,相同的装配顺序也可以做出不同的对象。也就是实现了构建算法和装配算法的解耦,实现了更好的复用。
3、代码实现
我们还是以Car为例,使用建造者模式来构建一辆Car。Car主要由三个组件组成:发动机、轮胎和座椅。
3.1 创建组件类
3.1.1 发动机
package com.zdw.builder;
public class Engine {
private String name;
public Engine(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3.1.2 轮胎
package com.zdw.builder;
public class Tyre {
private String name;
public Tyre(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3.1.3 座椅类
package com.zdw.builder;
public class Seat {
private String name;
public Seat(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3.2 创建Car类
package com.zdw.builder;
public class Car {
private Engine engine;
private Seat seat;
private Tyre tyre;
public Seat getSeat() {
return seat;
}
public void setSeat(Seat seat) {
this.seat = seat;
}
public Tyre getTyre() {
return tyre;
}
public void setTyre(Tyre tyre) {
this.tyre = tyre;
}
public Engine getEngine() {
return engine;
}
public void setEngine(Engine engine) {
this.engine = engine;
}
//车子的功能方法
public void run(){
System.out.println("我的发动机是:"+engine.getName()+"==我的轮胎是:"+tyre.getName()+"==我的座椅是:"+seat.getName());
System.out.println("我是一辆跑的好快的车子奥啊啊啊");
}
}
3.3 创建Builder接口和实现类
3.3.1 ICarBuilder接口
package com.zdw.builder;
public interface ICarBuilder {
Engine builderEngine();
Seat BuilderSeat();
Tyre createTyre();
}
3.3.2 CarBuilderImpl实现类
package com.zdw.builder;
public class CarBuilderImpl implements ICarBuilder {
@Override
public Engine builderEngine() {
return new Engine("永久牌发动机");
}
@Override
public Seat BuilderSeat() {
return new Seat("德利座椅");
}
@Override
public Tyre createTyre() {
return new Tyre("米其林轮胎");
}
}
3.4 创建Director的接口和实现类
3.4.1 ICarDirector接口
package com.zdw.builder;
public interface ICarDirector {
Car directorCar();//组装车子的方法
}
3.4.2 CarDirectorImpl实现类
package com.zdw.builder;
public class CarDirectorImpl implements ICarDirector {
private ICarBuilder carBuilder;
public CarDirectorImpl(ICarBuilder carBuilder) {
this.carBuilder = carBuilder;
}
@Override
public Car directorCar() {
Engine engine = carBuilder.builderEngine();
Seat seat = carBuilder.BuilderSeat();
Tyre tyre = carBuilder.createTyre();
Car car = new Car();
car.setEngine(engine);
car.setSeat(seat);
car.setTyre(tyre);
return car;
}
}
3.5 测试
package com.zdw.builder;
public class TestBuilder {
public static void main(String[] args) {
ICarDirector carDirector = new CarDirectorImpl(new CarBuilderImpl());
Car car = carDirector.directorCar();
car.run();
}
}
3.6 应用场景
StringBuilder的append()方法;
SQL中PreparedStatement对象;
JDOM中的DomBuilder,SAXBuilder对象。