JAVA设计模式-Builder

本文通过一个汽车制造的例子介绍了Builder设计模式的应用。该模式将产品的构造过程与其组成部分的创建过程分离,使得复杂的对象创建更加灵活和可控。

    Builder设计模式类似于Factory,都是用于生产一种产品,但是他们之间还是有一些区别的。至于有什么区别,仁者见仁,智者见智,我会在介绍完Builder模式之后说说我自己的看法,当然我的想法也参考了很多其他人的看法。下面先看一个例子吧:

 

    当要生产的一种产品具有相同的结构,并且每个构件的生产都很繁杂,就可以用Builder模式将具体构件的生产与整个成品的组装分离开来。还是拿本文的代码来举例,生产一辆汽车,生产汽车的厂家不需要知道引擎怎么生产的,不需要关心轮胎怎么生产的,也不需要关心玻璃怎么生产的。当他在生产一辆车的时候,只会说,我要一块日本产的引擎,于是就有了日本产的引擎(至于日本引擎怎么生产的他不关心,他只要一个引擎的成品),他又说我要一块美国产的玻璃,于是就有了美国产的玻璃,这样直到他得到了所有的构件,然后他把这些构件组装起来,组成一个成品(汽车)卖给客户。这就是一个典型的Builder模式。下面是代码:

 

 

 

    这个代码的运行结果:

    Car A is made by:"American Glass" "Japanese Wheel" "Chinese Engine"

    Car B is made by:"Japanese Glass" "American Wheel" "France Engine"

 

    首先要解释一下toString()这个方法(和Builder模式无关,只是顺带提一下),他是重载了Object的toString()方法,当使用System.out.println(object)的时候,就会隐式调用object的toString()方法。

 

    解释下代码,在main函数里面,director调用了builder里面的getProduct()方法,getProduct()方法实际就是组装的过程,getProduct()里面的buildGlass(),buildWheel(),buildEngine()就是在购买构件,而这些构件生产的具体过程放在了这些构件自身的类里面,可以看到buildGlass()里面有new一个对象,这就是在进行生产。这样就达到了组装和生产构件之间的分离。

 

    最后,说说我对Builder模式和Factory模式之间区别的理解。我个人认为Builder和Factory之间的区别就是组装和生产之间的区别,Builder着重将组装和构件的生产分离,Factory着重于优化生产的过程。本文的代码实际上还可以进行重构,例如,在buildGlass()函数里面,用到了new这个关键字,实际上可以将这个new换成工厂类,让工厂类来生产Glass。换一种说法,就是Factory不进行组装,Builder进行组装,当Factory进行组装的时候,它就变成Builder了。

 

    我也不知道我说清楚没,这只是我个人看法而已,仅供参考,不是标准答案。

 

    下期预告,Prototype模式,这个模式很简单,应该很快就能写完。 

 

 

<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]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值