建造者模式
建造者模式的本质:
- 分离对象性的子组件的单独构造(由Builder负责)和装配(Director负责)。从而可以构造出复杂对象,这个模式适用于:某个对象的构造过程很复杂。
- 由于是吸纳了构建和装配的解耦。不同的构造器,相同的装配,也可以做出不同的对象;相同的构造器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法、装配算法的解耦,实现了更好的复用。
应用场景有:
- StringBuilder类中的append方法
- SQL中的PreparedStatement
- JDOM中,DOMBuilder、SAXBuilder
本文以构建一个飞船为例。飞船由轨道舱、发动机和逃逸舱构成。(本文示例参考自北京尚学堂java教程,高淇)
飞船类如下:
public class Airship {
private OrbitalMudule orbitalMudule;//轨道舱
private Engine engine;//发动机
private EscapeTower escapeTower;//逃逸舱
public OrbitalMudule getOrbitalMudule() {
return orbitalMudule;
}
public void setOrbitalMudule(OrbitalMudule orbitalMudule) {
this.orbitalMudule = orbitalMudule;
}
public Engine getEngine() {
return engine;
}
public void setEngine(Engine engine) {
this.engine = engine;
}
public EscapeTower getEscapeTower() {
return escapeTower;
}
public void setEscapeTower(EscapeTower escapeTower) {
this.escapeTower = escapeTower;
}
public Airship(OrbitalMudule orbitalMudule, Engine engine,
EscapeTower escapeTower) {
this.orbitalMudule = orbitalMudule;
this.engine = engine;
this.escapeTower = escapeTower;
}
public Airship() {
}
@Override
public String toString() {
return "飞船 轨道舱是:" + orbitalMudule + ", 发动机是:" + engine
+ ", 逃逸舱是:" + escapeTower;
}
}
class OrbitalMudule{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public OrbitalMudule(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
}
class Engine{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Engine(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
}
class EscapeTower{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public EscapeTower(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
}
飞船类,包含轨道舱类,发动机类和逃逸舱类的三个成员变量。
接下来就是重点之一的Builder:
public interface AirshipBuider {
/**
* 建造飞船各个零件
*/
OrbitalMudule builderOrbitalMudule();
Engine builderEngine();
EscapeTower builderEscapeTower();
}
重点之二的Director:
public interface AirshipDirector {
/**
* 组装飞船对象
* @return
*/
Airship directorAirship();
}
public class MyAirshipBuilder implements AirshipBuider{
@Override
public OrbitalMudule builderOrbitalMudule() {
System.out.println("构建轨道舱-MJH制造");
return new OrbitalMudule("轨道舱-MJH制造");
}
@Override
public Engine builderEngine() {
System.out.println("构建发动机-MJH制造");
return new Engine("发动机-MJH制造");
}
@Override
public EscapeTower builderEscapeTower() {
System.out.println("构建逃逸舱-MJH制造");
return new EscapeTower("逃逸舱-MJH制造");
}
}
public class MyAirshipDirector implements AirshipDirector{
//首先应该有一个建造者
private AirshipBuider builder;
public MyAirshipDirector(AirshipBuider builder) {
this.builder = builder;
}
@Override
public Airship directorAirship() {
Engine e = builder.builderEngine();
OrbitalMudule o = builder.builderOrbitalMudule();
EscapeTower et = builder.builderEscapeTower();
Airship ship = new Airship(o,e,et);
return ship;
}
}
MyAirshipDirector实现了AirshipDirector,并且持有一个建造者的引用,通过构造器传入。建造者来建造具体的各个组件,然后由装配者完成组装,最后返回一个Airship对象。
测试:
public class Client {
public static void main(String[] args) {
AirshipDirector director = new MyAirshipDirector(new MyAirshipBuilder());
Airship ship = director.directorAirship();
System.out.println(ship);
}
}
输出:
构建发动机-MJH制造
构建轨道舱-MJH制造
构建逃逸舱-MJH制造
飞船 轨道舱是:轨道舱-MJH制造, 发动机是:发动机-MJH制造, 逃逸舱是:逃逸舱-MJH制造
结论:
建造者模式使得构建和装配由两个不同的角色承担,实现了构建算法和装配算法的解耦,可以非常方便地构建出多种复杂的对象,并且具有极佳的拓展性。