Builder模式的实现

2024-06-24 10:18
文章标签 builder 模式 实现

本文主要是介绍Builder模式的实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概念

在创建复杂对象时,将创建该对象的工作交给一个建造者,这个建造者就是一个Builder。在日常的开发中,常常看到,如下这些代码:

AlertDialog的实现

        AlertDialog.Builder builder = new AlertDialog.Builder(context);builder.setMessage("你好建造者");builder.setTitle("提示");AlertDialog dialog = builder.create();dialog.show();

其实你会发现,这个Builder是否多余呢?有时候是这么想的,可是如果你将这个代码进行如下写法,你就发现了buidler在一定程度上是优雅了代码:

        AlertDialog.Builder builder1 = new AlertDialog.Builder(context);builder1.setMessage("你好建造者").setTitle("提示").setPositiveButton("yes", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {}}).setNegativeButton("no", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {}});AlertDialog dialog1 = builder1.create();dialog1.show();

发现builder在创建对象的同时不停得返回对象本身this,这样代码就变成了一种链式的写法,很优雅。

实践

又一次在对于使用高德地图进行搜索时,我无意间使用了这个模式,感觉很漂亮的。流程如下:
* 请求的路径需要进行参数输入,而且参数相对多如: http://restapi.amap.com/v3/place/text?key=461f8bfebc9395589bb5e8ea28237c79&keywords=菜市场&city=梅州市&citylimit=true&offset=20&page=1&output=json
* 如直接使用String+String的话,感觉代码很不清晰

基于上面两点我写了这样的代码,虽然不是很规范的Builder模式,但是看起来还不错的。

URLBuidler路径的建造者

package com.jsoup.caishichang;import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;/*** Created by owant on 16/2/27.*/
public class URLBuilder {private volatile StringBuffer buffer;private volatile String cityName;private volatile String pageNumber;public URLBuilder() {buffer = new StringBuffer("http://restapi.amap.com/v3/place/text?key=461f8bfebc9395589bb5e8ea28237c79&citylimit=true&offset=20&output=json");}/*** 设置城市名字** @param city_code* @return*/public URLBuilder setCityCode(String city_code) {buffer.append("&city=").append(city_code);this.cityName = city_code;return this;}/*** 设置页数** @param page* @return*/public URLBuilder setPage(String page) {buffer.append("&page=").append(page);this.pageNumber = page;return this;}public URLBuilder setSearchKeyWorld(String keyWorld) throws UnsupportedEncodingException {String words_key_value = URLEncoder.encode(keyWorld, "UTF-8");buffer.append("&keywords=").append(words_key_value);return this;}public String getValue() {return buffer.toString();}public String getCityName() {return cityName;}public String getPageNumber() {return pageNumber;}
}

Client使用情况

package com.jsoup.caishichang;import java.io.UnsupportedEncodingException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;/*** Created by owant on 2/26/16.*/
public class Client {//query=阳江市&city=441702
//    private final static String cityCode = "阳江市";private final static String cityCode = "梅州市";//query=江门市&city=440703private final static String cityCode_2 = "江门市";/*** 阳江市* <p>* 1843,江城区,211* 1844,阳西县,211* 1845,阳东县,211* 1846,阳春市,211*/public static void main(String[] arg) throws UnsupportedEncodingException {//打印器Print print = Print.getInstance();//阳江市 12yueExecutorService threadPool = Executors.newFixedThreadPool(8);for (int i = 1; i <= 66; i++) {//路径创建URLBuilder builder = new URLBuilder();builder.setCityCode(cityCode).setSearchKeyWorld("菜市场").setPage(i + "");//添加进线程池threadPool.execute(new CaishiChangRun(builder, print));}threadPool.shutdown();//线程//new Thread(new CaishiChangRun(builder, print)).start();}}

总结

  • 对于Builder模式的使用关键是巧妙使用return this
  • 对于Builder一般在其创建对象的内部,是一个静态内部类;
  • 创建复杂度高的对象时使用Builder;

这篇关于Builder模式的实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1089864

相关文章

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

如何开启和关闭3GB模式

https://jingyan.baidu.com/article/4d58d5414dfc2f9dd4e9c082.html

十四、观察者模式与访问者模式详解

21.观察者模式 21.1.课程目标 1、 掌握观察者模式和访问者模式的应用场景。 2、 掌握观察者模式在具体业务场景中的应用。 3、 了解访问者模式的双分派。 4、 观察者模式和访问者模式的优、缺点。 21.2.内容定位 1、 有 Swing开发经验的人群更容易理解观察者模式。 2、 访问者模式被称为最复杂的设计模式。 21.3.观察者模式 观 察 者 模 式 ( Obser

通过SSH隧道实现通过远程服务器上外网

搭建隧道 autossh -M 0 -f -D 1080 -C -N user1@remotehost##验证隧道是否生效,查看1080端口是否启动netstat -tuln | grep 1080## 测试ssh 隧道是否生效curl -x socks5h://127.0.0.1:1080 -I http://www.github.com 将autossh 设置为服务,隧道开机启动

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测 目录 时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测基本介绍程序设计参考资料 基本介绍 MATLAB实现LSTM时间序列未来多步预测-递归预测。LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为

vue项目集成CanvasEditor实现Word在线编辑器

CanvasEditor实现Word在线编辑器 官网文档:https://hufe.club/canvas-editor-docs/guide/schema.html 源码地址:https://github.com/Hufe921/canvas-editor 前提声明: 由于CanvasEditor目前不支持vue、react 等框架开箱即用版,所以需要我们去Git下载源码,拿到其中两个主

android一键分享功能部分实现

为什么叫做部分实现呢,其实是我只实现一部分的分享。如新浪微博,那还有没去实现的是微信分享。还有一部分奇怪的问题:我QQ分享跟QQ空间的分享功能,我都没配置key那些都是原本集成就有的key也可以实现分享,谁清楚的麻烦详解下。 实现分享功能我们可以去www.mob.com这个网站集成。免费的,而且还有短信验证功能。等这分享研究完后就研究下短信验证功能。 开始实现步骤(新浪分享,以下是本人自己实现

基于Springboot + vue 的抗疫物质管理系统的设计与实现

目录 📚 前言 📑摘要 📑系统流程 📚 系统架构设计 📚 数据库设计 📚 系统功能的具体实现    💬 系统登录注册 系统登录 登录界面   用户添加  💬 抗疫列表展示模块     区域信息管理 添加物资详情 抗疫物资列表展示 抗疫物资申请 抗疫物资审核 ✒️ 源码实现 💖 源码获取 😁 联系方式 📚 前言 📑博客主页:

探索蓝牙协议的奥秘:用ESP32实现高质量蓝牙音频传输

蓝牙(Bluetooth)是一种短距离无线通信技术,广泛应用于各种电子设备之间的数据传输。自1994年由爱立信公司首次提出以来,蓝牙技术已经经历了多个版本的更新和改进。本文将详细介绍蓝牙协议,并通过一个具体的项目——使用ESP32实现蓝牙音频传输,来展示蓝牙协议的实际应用及其优点。 蓝牙协议概述 蓝牙协议栈 蓝牙协议栈是蓝牙技术的核心,定义了蓝牙设备之间如何进行通信。蓝牙协议