23种设计模式之建造者模式

本文介绍了建造者模式的本质及其应用场景,通过实例展示了如何分离对象子组件的构造与装配过程,实现复杂对象的创建。同时对比了建造者模式与工厂模式的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一节 23种设计模式之抽象工厂模式

建造模式的本质

1、分离了对象子组件的单独构造(由Builder来负责)和装配(由Director负责)。从而可以构造出复杂的对象。

这个模式适用于:某个对象的构建过程复杂的情况下使用。

2、由于实现了构建和装配的解耦。

不同的构建器,相同的装配,也可以做出不同的对象;

相同的构建器,不同的装配顺序也可以做出不同的对象。

也就是实现了构建算法、装配算法的解耦,实现了更好的复用。

场景

1、我们要建造一个复杂的产品。比如:飞船、手机。这个复杂的产品的创建。

有这样一个问题需要处理:装配这些子组件是不是有个步骤问题?

2、实际开发中,我们所需要的对象构建时,也非常复杂,有很多步骤需要处理。

类图

封装类:

//封装各个组件
public class AirShip {
	private OrbitalModule orbitalModule;
	private Engine engine;
	private EscapeTower escapeTower;
	
	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;
	}
	
	public void launch(){
		System.out.println("发射!");
	}
}
//子组件一封装
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;
	}
}
//子组件二封装
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;
	}
}
//子组件三封装
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;
	}
}

建造接口及实现类:

public interface AirShipBuilder {
	OrbitalModule builderOrbitalModule();
	Engine builderEngine();
	EscapeTower builderEscapeTower();
}
public class SxtAirShipBuilder implements AirShipBuilder{

	@Override
	public OrbitalModule builderOrbitalModule() {
		System.out.println("构建轨道舱!");
		return new OrbitalModule("轨道舱");
	}

	@Override
	public Engine builderEngine() {
		System.out.println("构建发动机!");
		return new Engine("发动机");
	}

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

}

装配接口及实现类:

public interface AirShipDirector {
	//组装飞船对象
	AirShip directorAirShip();
}
public class SxtAirShipDirector implements AirShipDirector{
	private AirShipBuilder builder;
	public SxtAirShipDirector(AirShipBuilder builder) {
		this.builder=builder;
	}
	@Override
	public AirShip directorAirShip() {
		OrbitalModule o=builder.builderOrbitalModule();
		Engine e=builder.builderEngine();
		EscapeTower et=builder.builderEscapeTower();
		
		//组装
		AirShip as=new AirShip();
		as.setOrbitalModule(o);
		as.setEngine(e);
		as.setEscapeTower(et);
		return as;
	}

}

测试方法:

public class Test1 {
	public static void main(String[] args) {
		AirShipDirector sad=new SxtAirShipDirector(new SxtAirShipBuilder());
		AirShip ship=sad.directorAirShip();
		System.out.println(ship.getEngine().getName());
		ship.launch();
	}

}

测试结果:

构建轨道舱!
构建发动机!
构建逃逸塔!
发动机
发射!


开发中应用场景

1、StringBuilder类的append方法。

2、SQL中PreparedStatement

3、JDOM中,DomBuilder、SAXBuilder

建造者模式的使用场景

1、相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用创建者模式。

2、多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用该模式。

3、产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,使用该模式非常合适。

建造者模式的优点

1、封装性

2、建造者独立,容易扩展

3、便于控制细节风险

建造者模式和工厂模式

这两个模式非常相似,但是记住:

建造者模式最主要的功能是基本方法的调用顺序安排。也就是这些基本方法已经实现了,通俗的说就是零件的装配,顺序不同产生的对象也不同。

工厂模式则重点是创建,创建零件是它的主要职责,安装顺序则不是它关心的。

 

下一节 23种设计模式之原型模式   待续......

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值