四、建造者模式

建造模式的本质:

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

适用场景
建造的对象,被建造时流程非常复杂,而且有各种组件,组件间还有关系,组件还要先组装后组装再组装等。

开发中应用场景:

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

该模式在一般开发中不多见。

同样,“见名知意”,一般以“Builder”结尾的都用到建造者模式,如StringBuilder、学习XML解析中,JDOM库中的类:DomBuilder、SaxBuilder…

【示例】飞船的建造
步骤一:飞船实体类。此处各组件均用相应的类表示,模拟真实情况。
AirShip.java

/**
 * 宇宙飞船
 * @author 枫枫
 *
 */
public class AirShip {//处于真实--用类模拟
	private OrbitalMoudle orbitalMoudle; //轨道舱
	private Engine engine; 				//发动机
	private EscapeTower escapeTower; 	//逃逸塔
	
	
	public void launch() {//此处就可以调用发动机、轨道舱等等组件
		System.out.println("发射"); 
		System.out.println("调用"+engine.getName());;
	}
	
	public OrbitalMoudle getOrbitalMoudle() {
		return orbitalMoudle;
	}
	public void setOrbitalMoudle(OrbitalMoudle orbitalMoudle) {
		this.orbitalMoudle = orbitalMoudle;
	}
	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;
	}
	
}


class OrbitalMoudle{
	private String name;

	public OrbitalMoudle(String name) {
		super(); //加不加无所谓,加了必在第一行
		this.name = name;
	}

	public String getName() {
		return name;
	}

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

class Engine{
	private String name;

	public Engine(String name) {
		super();
		this.name = name;
	}

	public String getName() {
		return name;
	}

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

class EscapeTower{
	private String name;

	public EscapeTower(String name) {
		super();
		this.name = name;
	}

	public String getName() {
		return name;
	}

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

步骤二:构建者Builder接口及实现类
AirShipBuilder.java

public interface AirShipBuilder {
	Engine builderEngine();
	OrbitalMoudle builderOrbitalMoudle();
	EscapeTower builderEscapeTower();
}

BJ_AirShipBuilder.java 北京牌飞船构建者

public class BJ_AirShipBuilder implements AirShipBuilder{

	@Override
	public Engine builderEngine() {
		System.out.println("构建发动机");
		return new Engine("北京牌发动机");	//此处可结合工厂模式,调用工厂生产单个产品,下同;也可单例模式
	}

	@Override
	public OrbitalMoudle builderOrbitalMoudle() {
		System.out.println("构建轨道舱");
		return new OrbitalMoudle("北京牌轨道舱");
	}

	@Override
	public EscapeTower builderEscapeTower() {
		System.out.println("构建逃逸塔");
		return new EscapeTower("北京牌逃逸塔");
	}
	
}

步骤三:组装者Director接口及实现类
AirShipDirector.java

public interface AirShipDirector {
	
	/**
	 * 组装飞船对象
	 * @return
	 */
	AirShip directAirShip();
}

BJ_AirShipDirectory.java 北京牌飞船组装者


public class BJ_AirShipDirector implements AirShipDirector{

	private AirShipBuilder builder; //获得构建者对象的引用
	
	
	public BJ_AirShipDirector(AirShipBuilder builder) {//在构建装配者时传入构建者对象,就可以使用builder了
		super();
		this.builder = builder;
	}




	@Override
	public AirShip directAirShip() {
		//通过构建者对象的引用,构建各种组件
		Engine e = builder.builderEngine();
		OrbitalMoudle o = builder.builderOrbitalMoudle();
		EscapeTower et = builder.builderEscapeTower();
		
		
		//装配成飞船对象
		AirShip ship = new AirShip();
		ship.setEngine(e);
		ship.setEscapeTower(et);
		ship.setOrbitalMoudle(o);
		
		return ship;
	}

}

步骤四:客户端(调用者)

public class Client {
	public static void main(String[] args) {
		AirShipDirector director = new BJ_AirShipDirector(new BJ_AirShipBuilder());

		AirShip ship = director.directAirShip();

		System.out.println(ship.getEngine().getName());
		
		//飞船已经建成,可调用其相关的方法
		ship.launch();
	}
}

对应UML类图:
在这里插入图片描述
难点在于各种模式的混合使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值