设计模式-Builder模式

本文详细介绍了Builder设计模式,包括模式定义、使用场景、UML类图解析以及具体实现,帮助读者全面掌握如何在Java中应用Builder模式进行对象构建。

1.Builder模式介绍

Bulder模式是一步步创建一个复杂对象的创建模型,它允许用户在不知道内部构建细节
的情况下可以更精细地控制对象的构造流程该模式为将构建复杂对象的过程和它的部件
解耦,使得构建过程和部件的表示隔离开来。

2.Builder模式的定义

将一个负责对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

3.Builder模式的使用场景

3.1 相同的方法,不同的执行顺序,产生不同的事件结果
3.2 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同
3.3 产品类非常复杂,或者产品类中的调用顺序不同产生了得作用,这个时候需要使用
Builder模式
3.4 当初始化一个对象特别的复杂,如参数多,且很多参数都具有默认值时

4.UML类图


5.实现

例如车的组装过程比较复杂,并且组装顺序是不固定的,下面我们以车的组装为例子简化
构建轮胎、车体形状、牌子等3个部分然后通过Director和具体的Builder类来构建车。
1.

<span style="font-size:14px;">	/**
	 * 车的抽象类,即Product角色
	 * Created by Teaphy
	 * 2016/3/12.
	 */
	public abstract class Car {
		String tire; // 轮胎
		String cabin;  // 车体
		String brand; // 车牌

		protected Car() {

		}

		// 设置轮胎
		public void setTire(String tire) {
			this.tire = tire;
		}
		// 设置车体
		public void setCabin(String cabin) {
			this.cabin = cabin;
		}

		// 设置车牌
		public abstract void setBrand();

		@Override
		public String toString() {
			return "Car{" +
					"tire='" + tire + '\'' +
					", cabin='" + cabin + '\'' +
					", brand='" + brand + '\'' +
					'}';
		}
	}</span>

2.

<span style="font-size:14px;">	/**
	 * 具体的Car类 BMWCar
	 * Created by Teaphy
	 * 2016/3/12.
	 */
	public class BMWCar extends Car {

		protected BMWCar() {

		}

		public void setBrand() {
			brand = "BMW";
		}
	}</span>

3.

<span style="font-size:14px;">	/**
	 * 抽象Builder类
	 * Created by Teaphy
	 * 2016/3/12.
	 */
	public abstract class Builder {
		// 设置轮胎
		public abstract void buildTire(String tire);

		// 设置车身
		public abstract void buildCabin(String cabin);

		// 设置牌子
		public abstract void buildBrand();

		// 创建Car
		public abstract Car create();
	}</span>

4.

	/** 
	 * 具体的Builder类  BWMCarBuilder
	 * Created by Teaphy
	 * 2016/3/12.
	 */
	public class BWMCarBuilder extends Builder {

		private Car mBmwCar = new BMWCar();

		public void buildTire(String tire) {
			mBmwCar.setTire(tire);
		}

		public void buildCabin(String cabin) {
			mBmwCar.setCabin(cabin);
		}

		public void buildBrand() {
			mBmwCar.setBrand();
		}

		public Car create() {
			return mBmwCar;
		}
	}

5. 

	/**
	 * Director类 负责构造Car
	 * Created by Teaphy
	 * 2016/3/12.
	 */
	public class Director {
		private Builder mBuilder = null;

		public Director(Builder mBuilder) {
			this.mBuilder = mBuilder;
		}

		public void construct(String tire, String cabin) {
			mBuilder.buildTire(tire);
			mBuilder.buildCabin(cabin);
			mBuilder.buildBrand();
		}
	}
6.测试类
	public class TestBuilder {
		public static void main(String[] args) {
			// 构建器
			Builder builder = new BWMCarBuilder();
			Director mDirector = new Director(builder);
			// 封装构建过程
			mDirector.construct("米其林", "流线型");
			// 构建Car
			Car car = builder.create();

			System.out.println(car.toString());
	}

7.
输出结果:Car{tire='米其林', cabin='流线型', brand='BMW'}

在上述示例中,通过Director类来构建BMWCar对象,而Director封装了构建负责对象的过程,对外隐藏了构建细节。Builder和Director一起将一个复杂的对象与它的表示分离,使得同样的构建创建不同的对象。
在实际开发过程中,Director角色经常被忽略,直接是用Builder来进行对对象封装构建,这个Builder通常为链式调用,它的关键点在于每个setter方法都返回自身,也就是return this;这样使得setter方法可以链式调用

<span style="font-size:14px;">	A.
	/**
	 * 抽象Builder类
	 * Created by Teaphy
	 * 2016/3/12.
	 */
	public abstract class _Builder {
		// 设置轮胎
		public abstract _Builder buildTire(String tire);

		// 设置车身
		public abstract _Builder buildCabin(String cabin);

		// 设置牌子
		public abstract _Builder buildBrand();

		// 创建Car
		public abstract Car create();
	}

	B.
	/**
	 * 具体的Builder类  BWMCarBuilder
	 * Created by Teaphy
	 * 2016/3/12.
	 */
	public class BuickBuilder extends _Builder {

		private BuickCar mBuickCar = new BuickCar();

		public _Builder buildTire(String tire) {
			mBuickCar.setTire(tire);
			return this;
		}

		public _Builder buildCabin(String cabin) {
			mBuickCar.setCabin(cabin);
			return this;
		}

		public _Builder buildBrand() {
			mBuickCar.setBrand();
			return this;
		}

		public Car create() {
			return mBuickCar;
		}
	}
	
	C. 测试类
	public class TestBuilder {
		public static void main(String[] args) {

			// 构建器
			_Builder _Builder = new BuickBuilder();
			// 构建
			// 构建时,将构建顺序颠倒,
			_Builder
					.buildBrand()
					.buildCabin("流线型")
					.buildTire("玛吉斯");
			System.out.println(_Builder.create().toString());
		}
	}
	
	D.
	
	输出结果:Car{tire='玛吉斯', cabin='流线型', brand='Buick'}</span>


<think>我们正在讨论Android开发中的Builder设计模式。根据引用内容,Builder模式主要用于构建复杂对象,通过链式调用设置参数,最后通过build方法创建对象实例。实现细节包括:1.私有化目标的构造方法,使其只能通过内部Builder构建。2.静态内部Builder,它拥有与目标相同的字段,并提供设置这些字段的方法(每个方法返回Builder自身以实现链式调用)。3.Builder提供一个build方法,在该方法中调用目标的私有构造方法(将Builder自身作为参数传入),在目标的构造方法中完成字段的复制。4.目标一旦创建,其参数不可更改(即不可变)。在Android中,AlertDialog就是使用Builder模式的经典例子。现在,我们按照用户要求,详细说明Builder模式的使用与实现。</think>### Android Builder设计模式的使用与实现 Builder设计模式是一种创建型模式,用于**分步构建复杂对象**,特别适用于参数众多或配置灵活的场景。在Android开发中,Builder模式被广泛应用于对话框创建、网络请求配置等场景。 #### 一、核心实现原理 1. **私有化构造方法** 目标的构造方法设为私有,禁止直接实例化。 ```java public class User { private final String name; // final确保不可变 private final int age; private User(Builder builder) { // 私有构造器 this.name = builder.name; this.age = builder.age; } } ``` 2. **静态内部Builder** 作为构建桥梁,持有与目标相同的字段: ```java public static class Builder { private String name; private int age; public Builder setName(String name) { this.name = name; return this; // 返回自身实现链式调用 } public Builder setAge(int age) { this.age = age; return this; } public User build() { return new User(this); // 调用私有构造器 } } ``` #### 二、Android经典应用:AlertDialog ```java // 使用示例 AlertDialog dialog = new AlertDialog.Builder(context) .setTitle("警告") .setMessage("确认删除?") .setPositiveButton("确定", (d, which) -> { /* 逻辑 */ }) .setNegativeButton("取消", null) .create(); // 最终构建对象 ``` **实现解析**(参考引用[2][4]): 1. `AlertDialog`构造器私有化,只能通过`Builder`构建 2. `Builder`的每个set方法返回自身,支持链式调用 3. `create()`方法调用`AlertDialog`私有构造器并传入配置参数 4. 最终通过`show()`将Dialog添加到WindowManager[^4] #### 三、自定义Builder模式实现 以构建用户对象为例: ```java public class User { private final String name; private final int age; private final String email; private User(Builder builder) { this.name = builder.name; this.age = builder.age; this.email = builder.email; } public static class Builder { private String name; private int age; private String email = ""; // 默认值 public Builder setName(String name) { this.name = name; return this; } public Builder setAge(int age) { if (age < 0) throw new IllegalArgumentException("年龄无效"); this.age = age; return this; } public Builder setEmail(String email) { this.email = email; return this; } public User build() { if (name == null) throw new IllegalStateException("名称不能为空"); return new User(this); } } } // 使用示例 User user = new User.Builder() .setName("张三") .setAge(30) .setEmail("zhang@example.com") .build(); ``` #### 四、设计优势 1. **参数解耦**:分离对象构建与参数设置(引用[1]) 2. **链式调用**:提升代码可读性(引用[6]) 3. **对象不可变**:build()后字段final确保线程安全 4. **参数校验**:可在build()方法中集中校验 5. **灵活扩展**:支持可选参数和默认值 #### 五、适用场景 1. 需创建含多个可选参数的对象 2. 要求对象创建后不可修改(不可变对象) 3. 需要分步构建复杂配置(如Retrofit.Builder) 4. 替代冗长的多参数构造方法 > **关键点**:Builder模式通过内部封装构建逻辑,既保证对象创建的灵活性,又维持了目标的不可变性。在Android中,除了对话框外,Glide片加载框架、Retrofit网络库等都广泛采用此模式[^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值