建造者模式(Builder Pattern)

什么是建造者模式?

建造者模式(Builder Pattern)将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

建造模式的本质

  • 分离了对象组件的单独构造(由Builder来负责)和装配(由Driector负责)。从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况下使用。
  • 由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以产生不同的对象;相同的构建器,不同的装配顺序也可以产生不同的对象。也就是实现了构建算法,装配算法的解耦,实现了更好的复用。

使用场景

  • 我们要建造一个复杂产品。比如:神舟飞船,Iphone。这个复杂产品的创建,有这样一个问题要处理:装配这些子组件是不是有个步骤问题?
  • 实际开发中,我们所要构建的对象十分复杂,有很多步骤需要处理时。

Java中的应用场景

  • StringBuilder类的append方法
  • SQL中的PreparedStatement
  • JDOM中,DomeBuiler,SAXBuilder

下面以建造神舟5号飞船说明,我们这里只是建造一个简单的神舟5号飞船了,它由发动机,逃逸塔,轨道舱组成,Builder负责构建这些组件,Driector负责将它们装配成神舟5号飞船。

类图

代码

package com.match.builder;
/**
* Builder接口
* @author Match
*
*/
public interface AirShipBuilder
{
//构建发动机
Engine builderEngine();
//构建轨道舱
OrbitalModule builderOrbitalModule();
//构建逃逸塔
EscapeTower builderEscapeTower();
}

package com.match.builder;
/**
* Director接口
* @author Match
*
*/
public interface AirShipDirector
{
//组装飞船
AirShip directAirShip();
}

package com.match.builder;
/**
* Builder类负责构造组件
* @author Match
*
*/
public class AirShip_5Builder implements AirShipBuilder
{
@Override
public Engine builderEngine()
{
System.out.println("建造发动机");
return new Engine("神舟5号发动机");
}
@Override
public EscapeTower builderEscapeTower()
{

System.out.println("建造逃逸塔");
return new EscapeTower("神舟5号逃逸塔");
}
@Override
public OrbitalModule builderOrbitalModule()
{
System.out.println("建造轨道舱");
return new OrbitalModule("神舟5号轨道舱");
}
}

package com.match.builder;
/**
* Director类负责装配生产成品
* @author Match
*
*/
public class Airship_5Director implements AirShipDirector
{
private AirShipBuilder builder;

public Airship_5Director(AirShipBuilder builder)
{
this.builder = builder;
}
@Override
public AirShip directAirShip()
{
Engine e = builder.builderEngine();
OrbitalModule o = builder.builderOrbitalModule();
EscapeTower et = builder.builderEscapeTower();
//装配成飞船对象
AirShip ship = new AirShip();
System.out.println("装配"+e.getName());
ship.setEngine(e);
System.out.println("装配"+et.getName());
ship.setEscapeTower(et);
System.out.println("装配"+o.getName());
ship.setOrbitalModule(o);
return ship;
}
}

package com.match.builder;
/**
* 发动机
* @author Match
*
*/
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;
}
}

package com.match.builder;
/**
* 逃逸塔
* @author Match
*
*/
public class EscapeTower
{
private String name;

public EscapeTower(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
}

package com.match.builder;
/**
* 轨道舱
* @author Match
*
*/
public class OrbitalModule
{
private String name;

public OrbitalModule(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
}

package com.match.builder;
/**
* 飞船
* @author Match
*
*/
public class AirShip
{
private OrbitalModule orbitalModule;//轨道舱
private Engine engine;//发动机
private EscapeTower escapeTower;//逃逸塔

public void launch()
{
System.out.println("发射!");
}
public OrbitalModule getOrbitalModule()
{
return orbitalModule;
}
public void setOrbitalModule(OrbitalModule orbitalModule)
{
this.orbitalModule = orbitalModule;
}
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;
}
}

测试代码:

package com.match.builder;

public class Client
{
public static void main(String[] args)
{
AirShipDirector director = new Airship_5Director(new AirShip_5Builder());
AirShip ship = director.directAirShip();
ship.launch();
}
}

控制台输出:

建造发动机

建造轨道舱

建造逃逸塔

装配神舟5号发动机

装配神舟5号逃逸塔

装配神舟5号轨道舱

发射!

加载评论框需要翻墙