设计23式—建造者

最近在看设计模式之禅,书的内容以讲故事的方式介绍了设计模式,强力推荐。

以下是个人对于建造者模式的理解

/*
 * 建筑者模式
 * 优点
 * 封装性好
 * 建造者独立,容易扩展
 * 便于控制细节风险
 */
public class MyMain {

	public static void main(String[] args) {
		// 创建一个导演对象
		Director director = new Director();
		// 要求导演对象创建A类车型号1000,A类车型号2000,B类车型号1000,B类车型号2000
		director.getCarA1000().test();
		System.out.println("--------------------------");
		director.getCarA2000().test();
		System.out.println("--------------------------");
		director.getCarB1000().test();
		System.out.println("--------------------------");
		director.getCarB2000().test();
	}

}

// 定义抽象车模型
abstract class CarModel {
	// 定义测试顺序
	ArrayList<String> sequence = new ArrayList<>();

	// 基本抽象方法:启动
	protected abstract void start();

	// 基本抽象方法:暂停
	protected abstract void stop();

	// 基本抽象方法:奔跑
	protected abstract void run();

	// 模板方法 测试
	protected void test() {
		System.out.println("开始测试");
		// 遍历sequence,根据顺序测试
		for (String action : sequence) {
			if (action.equals("start"))
				start();
			if (action.equals("stop"))
				stop();
			if (action.equals("run"))
				run();
		}
		System.out.println("测试结束");
	}
	// 设置测试顺序
	protected void setSequence(ArrayList<String> sequence) {
		this.sequence = sequence;
	}
}

// 继承车模型的A类车
class CarA extends CarModel {

	@Override
	protected void start() {
		System.out.println("A类车启动");
	}

	@Override
	protected void stop() {
		System.out.println("A类车暂停");
	}

	@Override
	protected void run() {
		System.out.println("A类车奔跑");
	}

}

// 继承车模型的B类车
class CarB extends CarModel {
	@Override
	protected void start() {
		System.out.println("B类车启动");
	}

	@Override
	protected void stop() {
		System.out.println("B类车暂停");
	}

	@Override
	protected void run() {
		System.out.println("B类车奔跑");
	}
}

// 定义抽象的车模型建造者
abstract class CarModelBuilder {
	// 设定车模型的测试顺序
	public abstract void setSequence(ArrayList<String> sequence);

	// 获得建造的车模型
	public abstract CarModel getCarModel();
}

// 继承抽象车模型建筑者的A类车模型建筑者
class CarABuilder extends CarModelBuilder {
	CarModel carA = new CarA();

	@Override
	public void setSequence(ArrayList<String> sequence) {
		carA.setSequence(sequence);
	}

	@Override
	public CarModel getCarModel() {
		return carA;
	}
}

// 继承抽象车模型建筑者的B类车模型建筑者
class CarBBuilder extends CarModelBuilder {
	CarModel carB = new CarB();

	@Override
	public void setSequence(ArrayList<String> sequence) {
		carB.setSequence(sequence);
	}

	@Override
	public CarModel getCarModel() {
		return carB;
	}
}

// 导演类
class Director {
	// 测试顺序
	private ArrayList<String> sequence = new ArrayList<>();
	// A类车建造者
	private CarModelBuilder carABuilder = new CarABuilder();
	// B类车建造者
	private CarModelBuilder carBBuilder = new CarBBuilder();

	// 获得A类车型号1000 该车测试顺序为 1启动 2暂停
	public CarA getCarA1000() {
		sequence.clear();
		sequence.add("start");
		sequence.add("stop");
		carABuilder.setSequence(sequence);
		// 向下转行
		return (CarA) carABuilder.getCarModel();
	}

	// 获得A类车型号2000 该车测试顺序为 1启动 2暂停 3启动 4 奔跑
	public CarA getCarA2000() {
		sequence.clear();
		sequence.add("start");
		sequence.add("stop");
		sequence.add("start");
		sequence.add("run");
		carABuilder.setSequence(sequence);
		// 向下转行
		return (CarA) carABuilder.getCarModel();
	}

	// 获得B类车型号1000 该车测试顺序为 1 启动 2 奔跑
	public CarB getCarB1000() {
		sequence.clear();
		sequence.add("start");
		sequence.add("run");
		carBBuilder.setSequence(sequence);
		// 向下转行
		return (CarB) carBBuilder.getCarModel();
	}

	// 获得B类车型号2000 该车测试顺序为 1 启动 2 奔跑 3暂停
	public CarB getCarB2000() {
		sequence.clear();
		sequence.add("start");
		sequence.add("run");
		sequence.add("stop");
		carBBuilder.setSequence(sequence);
		// 向下转行
		return (CarB) carBBuilder.getCarModel();
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值