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

本文深入讲解了建造者模式的概念,通过实例演示了如何将复杂对象的构建与表示分离,实现同一构建过程创建不同表示的目的。文章详细介绍了抽象建造者、具体建造者、导演者和产品等角色,并提供了一个电脑组装的代码示例。

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

定义:将一个复杂对象的构建与表示分离,使同样的构建过程可以创建不同的表示。也就是将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程可以生产出不同的内部表象的产品对象。

比如,我们熟知的“鱼香肉丝”这道菜(内部复杂的产品),参照菜谱上的制作流程(构建过程一样),10个厨师可能会做出不同味道的“鱼香肉丝”。

 建造者模式的角色定义,在建造者模式中存在以下4个角色:

抽象建造者(Builder)角色:给出一个抽象接口,用以规范产品对象的各个组成成分的建造。

具体建造者(ConcreteBuilder)角色:实现Builder接口,主要完成两方面工作:1.实现Builder声明的所有的接口,给出一步一步地完成创建产品实例的操作;2.在建造完成后,给出一个产品实例。

导演者(Director)角色:调用具体建造者提供的方法完成产品的创建。该角色无需知道产品的具体的内部细节,只需按照建造者提供的操作方法操作即可。

产品(Product)角色:具有复杂的内部结构。

/**
 * 具体产品:电脑
 * 说明:电脑具有复杂的内部结构
 * */
public class Computer {

	private String monitor;//显示器
	
	private String mainBoard;//主板
	
	private String cpu;//

	public String getMonitor() {
		return monitor;
	}

	public void setMonitor(String monitor) {
		this.monitor = monitor;
	}

	public String getMainBoard() {
		return mainBoard;
	}

	public void setMainBoard(String mainBoard) {
		this.mainBoard = mainBoard;
	}

	public String getCpu() {
		return cpu;
	}

	public void setCpu(String cpu) {
		this.cpu = cpu;
	}
}



/**
 * 抽象建造者角色:电脑组装过程规范化
 * */
public interface ComputerBuilder {

	/**
	 * 组装显示器
	 * */
	void buildMonitor();
	
	/**
	 * 组装主板
	 * */
	void buildMainBoard();
	
	/**
	 * 组装CPU
	 * */
	void buildCpu();
	
	public Computer createComputer();
}



/**
 * 具体建造者角色:台式电脑的具体组装过程
 * */
public class DesktopComputerBuilder implements ComputerBuilder{

	private Computer computer = new Computer();
	

	@Override
	public void buildMonitor() {
		computer.setMonitor("三星");
	}

	@Override
	public void buildMainBoard() {
		computer.setMainBoard("华硕");
	}

	@Override
	public void buildCpu() {
		computer.setCpu("AMD");
	}

	@Override
	public Computer createComputer() {
		// TODO Auto-generated method stub
		return computer;
	}
}




/**
 * 导演者角色:电脑组装工人
 * 说明:工人无需电脑相关内部构成,只需按照组装说明书(就是具体的建造者)组装就行了
 * */
public class ComputerWoker {

	 /**
     * 持有当前需要使用的建造器对象
     */
	private ComputerBuilder builder;

	public ComputerWoker(ComputerBuilder builder) {
		this.builder = builder;
	}
	
	/**
	 * 工人按照组装说明书组装即可
	 * */
	public void buildComputer() {
		builder.buildCpu();
		builder.buildMainBoard();
		builder.buildMonitor();
	}
}


public class Client {

	public static void main(String[] args) {
		/**
		 * 客户:我想要一台台式机
		 * 厂商:好的,我把组装手册给工人,工人给你组装一台
		 * */
		//组装手册
		ComputerBuilder builder = new DesktopComputerBuilder();
		//工人按照手册组装
		ComputerWoker woker = new ComputerWoker(builder);
		//工人开始组装
		woker.buildComputer();
		//按照手册,得到最终的产品
		Computer computer = builder.createComputer();
		
		System.out.println("主板:"+computer.getMainBoard()+"\n"
				+"CPU:"+computer.getCpu()+"\n"
				+"显示器:"+computer.getMonitor());
	}
}

输出结果:
主板:华硕
CPU:AMD
显示器:三星

 使用场景:

  1. 当生成的产品对象内部具有复杂的构造时;
  2. 当复杂对象需要与表示分离,可能需要创建不同的表示时;
  3. 当需要向客户隐藏产品内部结构的表现时。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值