您的位置:首页 > 编程语言 > Java开发

Java设计模式之建造者模式

2016-03-09 22:17 323 查看

建造者模式

建造者模式的本质:

分离对象性的子组件的单独构造(由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();
}


下面是具体实现的建造者,实现了AirshipBuilder接口:
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制造


结论:
建造者模式使得构建和装配由两个不同的角色承担,实现了构建算法和装配算法的解耦,可以非常方便地构建出多种复杂的对象,并且具有极佳的拓展性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息