设计模式之建造者模式

本文介绍建造者模式在Java中的应用,通过创建不同的建造者来组装相同类型的产品对象的不同部分,从而实现复杂对象的构建。文章提供了详细的代码示例,包括抽象产品类、具体产品类、抽象建造者类、具体建造者类、建造总工类和测试类。

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

描述:上一篇文章模板方法讲的抽象类中的普通方法可以在子类实现,按照需求可以实现自己的方法,算法是保持不变的;建造者模式跟模板方法不同之处是抽象类中的算法可以按需修改。


UML类图如下:



测试代码:

1、建造的产品抽象类

package com.java.builder;

import java.util.ArrayList;
import java.util.List;

public abstract class CarModel {
	
	private List<String> sequence = new ArrayList<String>();
	
	public List<String> getSequence() {
		return sequence;
	}

	public void setSequence(List<String> sequence) {
		this.sequence = sequence;
	}

	public abstract void start();
	
	public abstract void alarm();
	
	public abstract void engine();
	
	public abstract void stop();
	
	public void run(){
		if(sequence != null && sequence.size() > 0){
			for(String str : sequence){
				if(str.equalsIgnoreCase("start")){
					start();
				}else if(str.equalsIgnoreCase("engine")){
					engine();
				}else if(str.equalsIgnoreCase("alarm")){
					alarm();
				}else if(str.equalsIgnoreCase("stop")){
					stop();
				}
			}
		}
	}
}

2、具体产品类

package com.java.builder;

public class BenzCarModel extends CarModel {

	@Override
	public void start() {
		System.out.println("奔驰车启动起来是这样子的...");
	}

	@Override
	public void alarm() {
		System.out.println("奔驰车喇叭声音是这样子的...");
	}

	@Override
	public void engine() {
		System.out.println("奔驰车引擎启动是这样子的...");
	}

	@Override
	public void stop() {
		System.out.println("奔驰车停止是这样子的...");
	}

}
package com.java.builder;

public class BmwCarModel extends CarModel {

	@Override
	public void start() {
		System.out.println("宝马车启动起来是这样子的...");
	}

	@Override
	public void alarm() {
		System.out.println("宝马车喇叭声音是这样子的...");
	}

	@Override
	public void engine() {
		System.out.println("宝马车引擎启动是这样子的...");
	}

	@Override
	public void stop() {
		System.out.println("宝马车停止是这样子的...");
	}

}

3、建造者抽象类,客户需要的产品从这个类被建造出来

package com.java.builder;

import java.util.List;

public abstract class Builder {

	public abstract void setSequence(List<String> sequence);
	
	public abstract CarModel getCarModel();
}

4、具体建造者

package com.java.builder;

import java.util.List;

public class BenzCarBuilder extends Builder {
	
	private BenzCarModel model = new BenzCarModel();
	
	@Override
	public void setSequence(List<String> list) {
		this.model.setSequence(list);
	}
	
	@Override
	public CarModel getCarModel() {
		return this.model;
	}
	
}
package com.java.builder;

import java.util.List;

public class BmwCarBuilder extends Builder {
	
	private BmwCarModel model = new BmwCarModel();
	
	@Override
	public void setSequence(List<String> sequence) {
		this.model.setSequence(sequence);
	}

	@Override
	public CarModel getCarModel() {
		return this.model;
	}
	
}

5、建造的总工即包头工

package com.java.builder;

import java.util.ArrayList;
import java.util.List;

public class Director {
	
	private BenzCarBuilder benzBuilder = new BenzCarBuilder();
	private BmwCarBuilder bmwCarBuilder = new BmwCarBuilder();
	private List<String> sequence = new ArrayList<String>();
	
	public BenzCarModel getBenzCarModel(){
		sequence.clear();
		sequence.add("start");
		sequence.add("engine");
		sequence.add("alarm");
		sequence.add("stop");
		benzBuilder.setSequence(sequence);
		return (BenzCarModel)benzBuilder.getCarModel();
	}
	
	public BmwCarModel getBmwCarModel(){
		sequence.clear();
		sequence.add("start");
		sequence.add("alarm");
		sequence.add("engine");
		sequence.add("stop");
		bmwCarBuilder.setSequence(sequence);
		return (BmwCarModel)bmwCarBuilder.getCarModel();
	}
}

6、测试类

package com.java.builder;

public class BuilderTest {

	public static void main(String[] args) {
		Director director = new Director();
		BenzCarModel benzCar = director.getBenzCarModel();
		benzCar.run();
		
		BmwCarModel bmwCar = director.getBmwCarModel();
		bmwCar.run();
	}

}


7、测试结果

奔驰车启动起来是这样子的...
奔驰车引擎启动是这样子的...
奔驰车喇叭声音是这样子的...
奔驰车停止是这样子的...
宝马车启动起来是这样子的...
宝马车喇叭声音是这样子的...
宝马车引擎启动是这样子的...
宝马车停止是这样子的...





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值