JAVA设计模式-创建型模式-建造者模式

本文深入解析建造者模式,对比抽象工厂模式,详细阐述其结构、应用案例及代码实现,帮助读者掌握复杂对象构建技巧。

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

何为建造者模式?

建造者模式能够将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。这句话理解起来可能有点抽象,简单来说就是调用相同的创建对象的方法(建造过程)可以创建出不同的对象。

建造者模式和抽象工厂模式不同比较

  1. 与抽象工厂模式相比,建造者模式返回一个组装好的完整产品,而抽象工厂模式返回一系列相关的产品,这些产品位于不同的产品等级结构,构成了一个产品族 。
  2. 在抽象工厂模式中,客户端实例化工厂类,然后调用工厂方法获取所需产品对象,而在建造者模式中,客户端可以不直接调用建造者的相关方法,而是通过指挥者类来指导如何生成对象,包括对象的组装过程和建造步骤,它侧重于一步步构造一个复杂对象,返回一个完整的对象 。
  3. 如果将抽象工厂模式看成汽车配件生产工厂,生产一个产品族的产品,那么建造者模式就是一个汽车组装工厂,通过对部件的组装可以返回一辆完整的汽车。

建造者模式的结构

  1. 抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 retrieveResult()。
  2. 具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。
  3. 指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在导演者中不涉及具体产品的信息。
  4. 产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个滅部件。

一般情况之下,指挥者是和客户端打交道的一个角色,指挥者将客户端创建的产品的请求划分为对各个零件的建造请求,在将这些请求委派给具体建造者角色,具体建造者角色是做具体建造工作的,但是却是不让客户端知道的。

案例分析

还是举例来说明吧,如果说我要创建一部手机,我需要先制造手机的几个核心部件,例如:屏幕、电池、听筒、话筒、机身等。

Product(产品角色)

public class MobilePhone {

	//手机屏幕
	private String screen;
	//电池
	private String battery;
	//话筒
	private String microphone;
	//听筒
	private String phoneReceiver;
	//机身
	private String phoneBody;
}

Builder(抽象建造者)

每一部手机都是这个类的对象,在创建一部手机的时候都要保证这几个核心部件的创建。所以创建手机是需要一个标准规范的,因为这几个核心部件都可以是不同的型号,不同的型号的部件制造出来的手机也是不同的,这样就有了下面建造规范的接口。

public interface IBuildPhone {

	/**
	 * 建造者手机屏幕
	 */
	void buildScreen();

	/**
	 * 建造手机电池
	 */
	void buildBattery();

	/**
	 * 建造手机听筒
	 */
	void buildMicrophone();

	/**
	 * 建造手机话筒
	 */
	void buildPhoneReceiver();

	/**
	 * 建造手机机身
	 */
	void buildPhoneBody();

	/**
	 * 创建手机
	 * @return
	 */
	MobilePhone retrieveResult();

}

ConcreteBuilder(具体建造者)

有了规范了,就可以创建手机了,先创建一个 OnePuls 手机。

public class OnePuls implements IBuildPhone {

	private MobilePhone mobilePhone;

	public OnePuls() {
		this.mobilePhone = new MobilePhone();
	}

	@Override
	public void buildScreen() {
		mobilePhone.setScreen("高清显示屏");
	}

	@Override
	public void buildBattery() {
		mobilePhone.setBattery("3500mAh电池容量");
	}

	@Override
	public void buildMicrophone() {
		mobilePhone.setMicrophone("智能听筒");
	}

	@Override
	public void buildPhoneReceiver() {
		mobilePhone.setPhoneReceiver("智能话筒");
	}

	@Override
	public void buildPhoneBody() {
		mobilePhone.setPhoneBody("太空材质打造机身");
	}

	@Override
	public MobilePhone retrieveResult() {
		return mobilePhone;
	}
}

Director(指挥者)

指挥者 它决定了手机的实现过程,然后给你一个完美的手机,Director角色:

public class Director {

	public MobilePhone createMobilePhone(IBuildPhone buildPhone){
		buildPhone.buildBattery();
		buildPhone.buildMicrophone();
		buildPhone.buildScreen();
		buildPhone.buildPhoneReceiver();
		buildPhone.buildPhoneBody();
		return buildPhone.retrieveResult();
	}

}

测试以及测试对应结果

public class Client {

	public static void main(String[] args){
		//创建一个 OnePuls 手机
		MobilePhone onePuls = new Director().createMobilePhone(new OnePuls());
		System.out.println(onePuls);

		//创建一个 IPhoneX 手机
		MobilePhone iPhoneX = new Director().createMobilePhone(new IPhoneX());
		System.out.println(iPhoneX);
	}

}
MobilePhone{screen='高清显示屏', battery='3500mAh电池容量', microphone='智能听筒', phoneReceiver='智能话筒', phoneBody='太空材质打造机身'}
MobilePhone{screen='OLED显示屏', battery='3000mAh电池容量', microphone='听筒', phoneReceiver='话筒', phoneBody='iPhoneX机身'}

UML类图

代码案例相关文件

http://pvyob7cem.bkt.clouddn.com/builder.rar

上述案例参考自:纪莫
https://www.cnblogs.com/jimoer/p/9265543.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值