漫画:什么是 “建造者模式” ?

作者:东风玖哥

来源: 程序员小灰

—————  第二天  —————

————————————

首先,我们来定义一个Product类:

public class Product {ArrayList<String> parts = new ArrayList<String>();public void add(String part) {parts.add(part);}public void show() {System.out.println(parts);}
}

接下来,我们定义抽象的Builder类:

public abstract class Builder {public abstract void buildPartA();public abstract void buildPartB();public abstract Product getResult() ;
}

然后,是具体的Builder实现类:

public class ConcreteBuilder extends Builder {private Product product = new Product();public Product getResult() {return product;}@Overridepublic void buildPartA() {product.add("构建产品的上半部分");}@Overridepublic void buildPartB() {product.add("构建产品的下半部分");}
}

在Builder类之外,则是Director类来控制Builder的生产过程:

public class Director {private Builder builder;public Director(Builder builder) {this.builder = builder;}public void construct() {builder.buildPartA();builder.buildPartB();}
}

最后,是客户端的测试代码:

Builder builder = new ConcreteBuilder();
Director director = new Director(builder);
director.construct();
Product product = builder.getResult();
System.out.println(product.show());

我们来看一下运行的结果:

[构建产品的上半部分, 构建产品的下半部分]

// 默认采用Builder进行建造
public OkHttpClient() {this(new Builder());
}// 由builder配置分发器、代理、协议以及自定义拦截器等
OkHttpClient(Builder builder) {this.dispatcher = builder.dispatcher;this.proxy = builder.proxy;this.protocols = builder.protocols;/** 省略大段代码 */boolean isTLS = false;for (ConnectionSpec spec : connectionSpecs) {isTLS = isTLS || spec.isTls();}/** 省略大段代码. */if (interceptors.contains(null)) {throw new IllegalStateException("Null interceptor: " + interceptors);}if (networkInterceptors.contains(null)) {throw new IllegalStateException("Null network interceptor: " + networkInterceptors);}
}
public static final class Builder {public Builder() {
// 分发器、协议、代理的默认参数dispatcher = new Dispatcher();protocols = DEFAULT_PROTOCOLS;proxySelector = ProxySelector.getDefault();if (proxySelector == null) {proxySelector = new NullProxySelector();}}Builder(OkHttpClient okHttpClient) {// 反向配置分发器、代理、协议this.dispatcher = okHttpClient.dispatcher; this.proxy = okHttpClient.proxy; this.protocols = okHttpClient.protocols;
// 新增所有自定义拦截器和自定义网络拦截器this.interceptors.addAll(okHttpClient.interceptors);this.networkInterceptors.addAll(okHttpClient.networkInterceptors);}// 配置代理public Builder proxy(@Nullable Proxy proxy) {this.proxy = proxy;return this;}// 向拦截器链中增加自定义拦截器public Builder addInterceptor(Interceptor interceptor) {if (interceptor == null) throw new IllegalArgumentException("interceptor == null");interceptors.add(interceptor);return this;}// 最后是build()方法,生成OkHttpClient对象public OkHttpClient build() {return new OkHttpClient(this);}
}

/**将指定的字符串追加到此字符序列*/
@Override
public StringBuilder append(CharSequence s) {super.append(s);// 实现过程略return this;
}
/**将此字符序列用其反转形式取代*/
@Override
public StringBuilder reverse() {super.reverse();// 实现过程略return this;
}

下面让我们来编写一下测试代码:

StringBuilder sb = new StringBuilder("若为自由故");
sb.append("只要主义真");
sb.reverse();
System.out.println(sb);
StringBuilder sb1 = new StringBuilder("若为自由故");
sb1.reverse();
sb1.append("只要主义真");
System.out.println(sb1);

测试结果如下:

System.out: 真义主要只故由自为若
System.out: 故由自为若只要主义真

建造者模式与简单工程模式的区别,在于建造者模式多出一个Builder类,使得创建对象的灵活性大大增加,适用于如下场景:

(1)创建一个对象,多个同样的方法的调用顺序不同,产生的结果不同

(2)创建一个对象,特别复杂,参数多,而且很多参数都有默认值

System.out.println("Hello World");

短短一行代码,背后有什么样的机制呢?

Java的编译原理,是将Hello.java编译成能被VM理解的Hello.class,然后再转化为能被不同硬件设备理解的bytecode进而执行的。

著名的字节码增强框架ASM,就是在Hello.java编译成Hello.class时可以读取并分析类信息、改变类行为、增强类功能甚至生成新的类的bytecode分析和操作框架。

我们来看一下相关的代码,代码当中的mv,来自ASM框架的MethodVisitor接口。

// 访问System类的类型为PrintSystem类型的静态变量out
mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
// 访问常量池中的数据"Hello World"
mv.visitLdcInsn("Hello World");
// 调用PrintStream类的println()方法并把刚才获取到的对象当做String类型的参数传入
mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);

往期推荐

实现工具自由!开源的工具桌面箱

TCP泄露了操作系统信息…

在部队敲代码是一种什么样的体验?

漫画:什么是HTTPS协议?

点分享

点收藏

点点赞

点在看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/514446.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云云效何勉:云原生是“精益实践”的最佳助力

简介&#xff1a; 1月15日&#xff0c;国内知名“精益产品开发”研究和实践者、阿里云云效资深技术专家何勉在阿里云《云计算情报局》线上直播栏目中&#xff0c;分享其对研发新模式的最新思考&#xff0c;提出“下一代精益开发方法”&#xff0c;助力企业在研发效能上提升10倍…

开发效率提升15倍!批流融合实时平台在好未来的应用实践

简介&#xff1a; 本文由好未来资深数据平台工程师毛祥溢分享&#xff0c;主要介绍批流融合在教育行业的实践。内容包括两部分&#xff0c;第一部分是好未来在做实时平台中的几点思考&#xff0c;第二部分主要分享教育行业中特有数据分析场景。 1.背景介绍 好未来介绍 好未来是…

那些公司都配不上我,所以我选择创业

【CSDN 编者按】她&#xff0c;一个89年的农村姑娘&#xff0c;从种蘑菇到卖煤球&#xff0c;再到敲代码做云原生&#xff0c;成为企业创始人&#xff0c;一路走来她都经历了哪些困难与挑战&#xff0c;对于新生代程序员又有哪些建议&#xff1f;让我们一起来看看她是怎么说的。…

如何跑通第一个 SQL 作业

简介&#xff1a; 本文由阿里巴巴技术专家周凯波&#xff08;宝牛&#xff09;分享&#xff0c;主要介绍如何跑通第一个SQL。 一、SQL的基本概念 1.SQL 分类 SQL分为四类&#xff0c;分别是数据查询语言&#xff08;DQL&#xff09;、数据操纵语言&#xff08;DML&#xff09…

云原生DevOps的5步升级路径

简介&#xff1a; 究竟什么是云原生DevOps呢&#xff1f;我们认为&#xff1a;云原生DevOps是充分利用云原生基础设施&#xff0c;基于微服务/无服务架构体系和开源标准&#xff0c;语言和框架无关&#xff0c;具备持续交付和智能自运维能力&#xff0c;从而做到比传统DevOps更…

数据创新的四个陷阱

简介&#xff1a; 数据的重要性在当今已经无需在多言&#xff0c;所有的企业都意识到数据的重要性&#xff0c;都希望利用数据来驱动业务的发展。但是&#xff0c;很多企业信息化管理者依然存在对于数据智能&#xff0c;数据驱动的一些误解&#xff0c;这些误解会让企业的数据利…

Parallels 发布 Desktop 17版本,支持 Windows 11 和 macOS Monterey

Parallels Desktop 17 亮点速揽&#xff1a;性能提升&#xff0c;对图像效果加以改进、增强了 Windows 游戏体验&#xff0c;同时是全球首个在搭载 Apple M1 芯片的 Mac 上运行的 macOS Monterey 虚拟机&#xff0c;带来更为无缝的跨平台工作体验。 编辑 | 宋慧 头图 | Paralle…

如何将实时计算 Flink 与自身环境打通

简介&#xff1a; 如何使用实时计算 Flink 搞定数据处理难题&#xff1f;实时计算 Flink 客训练营产品、技术专家齐上阵&#xff0c;从 Flink的发展、 Flink 的技术原理、应用场景及行业案例&#xff0c;到开源Flink功能介绍和实时计算 Flink 优势详解&#xff0c;现场实操&…

一文知晓浪潮云海OS在SPEC Cloud测试中的调优实践!

日前&#xff0c;SPEC&#xff08;Standard Performance Evaluation Corporation&#xff0c;即国际标准性能评测组织&#xff09;公布了最新 Cloud IaaS 2018 Benchmark 测试成绩&#xff0c;在同规模测试场景下浪潮数据核心产品浪潮云海OS再次刷新世界纪录&#xff0c;性能得…

阿里云 EMR Delta Lake 在流利说数据接入中的架构和实践

简介&#xff1a; 为了消灭数据孤岛&#xff0c;企业往往会把各个组织的数据都接入到数据湖以提供统一的查询或分析。本文将介绍流利说当前数据接入的整个过程&#xff0c;期间遇到的挑战&#xff0c;以及delta在数据接入中产生的价值。 背景 流利说目前的离线计算任务中&…

怎么提升写代码的能力

简介&#xff1a; 对于程序员而言&#xff0c;我始终认为代码是展现能力的关键&#xff0c;一个优秀程序员写的代码&#xff0c;和一个普通程序员写的代码是很容易看出差别的&#xff0c;代码作为程序员的硬实力和名片的展示&#xff0c;怎么提升写代码的能力始终是一个关键的话…

发力LPWAN 升哲打磨数智城市物联网通信之“芯”

8月上旬&#xff0c;随着多项物联网芯片与通信领域技术发明专利证书的下发&#xff0c;升哲科技&#xff08;SENSORO&#xff09;已在低功耗广域物联网&#xff08;LPWAN&#xff09;及相关领域拥有近百项独家专利&#xff0c;突破国外专利封锁实现国产、自主、可控。这些专利技…

android studio证件照代码,Android 修图(换证件照背景,污点修复)

背景前段时间的一个周末&#xff0c;一个女生让我帮她换一下他的证件照背景&#xff0c;我又没带电脑。我又不好意思拒接&#xff0c;怎么办呢&#xff1f;应用商店下载一个证件照换背景的APP&#xff0c;瞬间换完&#xff0c;我正准备保存时&#xff0c;跳出来一个支付框&…

闲鱼是怎么让二手属性抽取准确率达到95%+的?

闲鱼是怎么让二手属性抽取准确率达到95%的&#xff1f; 先上效果 图1 - 二手属性抽取算法效果Demo(1) 背景 闲鱼作为一款C2X的app&#xff0c;站在商品发布的角度&#xff0c;闲鱼商品相对于淘宝商品的特点有&#xff1a; 轻发布导致商品信息不足 闲鱼采用图文描述的轻发布模…

代号红狗:那些站在微软云起点的中国创业者

作者&#xff1a;亲爱的数据 来源&#xff1a;亲爱的数据011996年的北京。上高中二年级的左玥&#xff0c;代表崇文区参加市一级"四通杯"青少年计算机程序设计竞赛&#xff0c;得了一等奖。据左玥回忆&#xff0c;在去参赛的路上&#xff0c;辅导老师还在吐槽&#x…

如何迁移 Flink 任务到实时计算

简介&#xff1a; 本文由阿里巴巴技术专家景丽宁&#xff08;砚田&#xff09;分享&#xff0c;主要介绍如何迁移Flink任务到实时计算 Flink 中来。 通常用户在线下主要使用 Flink run&#xff0c;这会造成一些问题&#xff0c;比如&#xff1a;同一个配置因版本而变化&#xf…

如何落地云原生DevOps?

简介&#xff1a; 什么是云原生DevOps&#xff1f;在阿里内部有怎样的实践&#xff1f;企业又该如何落地&#xff1f;阿里云云效专家团队提出了下一代精益产品开发方法体系——ALPD&#xff0c;提供了系统的云原生DevOps落地的方法支撑&#xff0c;帮助企业渐进式地迈入云原生D…

亚马逊独霸美国安云计算未来十年订单;英伟达推出首个元宇宙平台;华为云、天翼云会合并吗?...

NEWS本周新闻回顾亚马逊独霸美国安云计算未来十年订单&#xff0c;微软表示不服亚马逊AWS获得美国国家安全局100亿美元云计算合同。得知亚马逊拿下订单后&#xff0c;微软已向政府问责提交文件&#xff0c;提出抗议。最终……还是亚马逊笑到了最后英伟达推出全球首个元宇宙平台…

如何做好技术 Team Leader?

简介&#xff1a; 作为一个技术TL&#xff08;Team Leader&#xff09;&#xff0c;除了自身技能&#xff0c;还会面临诸多团队管理上的困难和挑战。如何定义和明确团队的目标&#xff1f;怎样建立优秀的工程文化&#xff1f;让团队长期发挥战斗力和创新能力的核心是什么&#…

android应用控制百度地图,Android中应用百度地图API开发地图APP实例-显示百度地图...

场景效果在使用百度地图API之前需要先在百度地图开放平台中申请API_KEY申请API_KEY登录百度开放平台后找到控制台下的应用管理-创建应用依次输入应用名&#xff0c;应用类型选择Android SDK然后下面需要输入发布版SHA1和包名获取应用SHA1首先来到.Android文件所在的位置&#x…