漫画:什么是 “建造者模式” ? 拼搏现实的明天。 2022-09-04 01:47 92阅读 0赞 ![1d99ff493341c1d18d94900653d6ebd4.png][] ![d54da97711b0e6a9dedb3843e4d6bbf9.png][] **————— 第二天 —————** ![9fe050acf36b478dacddd76bc864baf7.png][] ![dc0b8da7b775ad36a6be3942a70481e2.png][] ![12468add243ab9f09bbb3f244b5c6e13.png][] ![dbef0e2740dfb86fd43acdf195440398.png][] ![f0f1e81f43566595b39175d5b8031c33.png][] ![6ff008735898a1dab722addb94e8c316.png][] ![512f27d2ab155a8b8d0d833b83be257e.png][] ![1dc1370776a788874d868e6ab372d3b0.png][] ![d6ba353ec28e02e4ba5a67d99c61225d.png][] ———————————— ![5a768a46bf12620ea68f0d4b871d28df.png][] ![fd4381715fdc694c50abc963b0c588d1.png][] ![517e4ba339260cadca1f58a892a25ddc.png][] ![4d1a865fc47bb1acefe81af4f319d9e4.png][] ![719846c3a16e9bb334bc48e5154782f7.png][] ![24bd4feeec337f2b41c98a4a9faeffcc.png][] ![12ee0dbe5ff1dc171303c06de69c439c.png][] ![62d5dc7591f9270ccc11bfd6c6ae8dd9.png][] ![e5b9ff321a276bcc1409a9d0d886dd39.png][] ![b166348ca85a8659b81814fdfcff3103.png][] 首先,我们来定义一个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; } @Override public void buildPartA() { product.add("构建产品的上半部分"); } @Override public 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(); product.show(); 我们来看一下运行的结果: [构建产品的上半部分, 构建产品的下半部分] ![15d5d1d824db30c77e2374da326066e6.png][] ![3c9b5faa39d75a57e2a7d9db761045d3.png][] ![5be566278a85f1fcb4a45aa16040d96c.png][] // 默认采用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); } } ![538ff9a7a3317cfda4206a75d6003560.png][] ![2f6713e1f734fc4dc33a4b5f95e176ac.png][] /**将指定的字符串追加到此字符序列*/ @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: 故由自为若只要主义真 ![3001ce47902e5b6d5808105dd64091f1.png][] ![cf7061200c40605630a01ed36f686564.png][] ![7f2d06fd81b59dfee26c305816bbdd9b.png][] ![fe93375dd3aa14be1d8f89bc2c13c7a2.png][] ![12d612da0cacb76e9cd7b94e28538d09.png][] ![dc4a019086931121ae6cfd450046a3dd.png][] ![912e69a395f7efc15ced52f5b8cc1976.png][] ![753a427eb5f50bdcd254d3e2c7b4cde0.png][] 建造者模式与简单工程模式的区别,在于建造者模式多出一个Builder类,使得创建对象的灵活性大大增加,适用于如下场景: (1)创建一个对象,多个同样的方法的调用顺序不同,产生的结果不同 (2)创建一个对象,特别复杂,参数多,而且很多参数都有默认值 ![5e6357c42001ee72d6b3c1832b556f36.png][] ![735070911aeb4561b7073f4971ba9767.png][] ![04157bf01ef1779531ff274c69f475df.png][] ![e34e0977e6e9d7fc68e2f442cdfc8ac8.png][] System.out.println("Hello World"); ![145de900366efa84e3d0934f082984c0.png][] ![169047ebbb02a7453f045c59fc6cc851.png][] ![47ee9c40af7ac5307cba1a50b4d2adb2.png][] ![864fbadb750a1b4ef43f7fc229b20a8e.png][] 短短一行代码,背后有什么样的机制呢? 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); ![7491914d88034425921b8ba5fdcfdb56.png][] ![223fe5a43d61bc35d5aba86f626d5797.png][] ![d88f915a50994a831be801bcd2d13b99.png][] ![d9ad5fe778de7009baccf9b32b08267e.png][] ![e38c94f2497a653ded4420f1c7886068.png][] [1d99ff493341c1d18d94900653d6ebd4.png]: /images/20220829/d26b8511f8e646baa978794799f3f830.png [d54da97711b0e6a9dedb3843e4d6bbf9.png]: /images/20220829/40810ee8d495486e9e9807a22e47fbd5.png [9fe050acf36b478dacddd76bc864baf7.png]: /images/20220829/b83b492251ff45afa80e715fa2d1e406.png [dc0b8da7b775ad36a6be3942a70481e2.png]: /images/20220829/79775668562240fd8a9da0cc7bf1805b.png [12468add243ab9f09bbb3f244b5c6e13.png]: /images/20220829/270823c8aa3f4a2b82b9031373e7d6ea.png [dbef0e2740dfb86fd43acdf195440398.png]: /images/20220829/d7182629d5cb4f77813b6b9d4b148fbc.png [f0f1e81f43566595b39175d5b8031c33.png]: /images/20220829/a026d432c63444bca914dee0c305f9e3.png [6ff008735898a1dab722addb94e8c316.png]: /images/20220829/38a0277b15e34443a7d60bf5f9a45512.png [512f27d2ab155a8b8d0d833b83be257e.png]: /images/20220829/6c55d9df539a4ffc83f9f9f42e5ea563.png [1dc1370776a788874d868e6ab372d3b0.png]: /images/20220829/be4b6b2d248e4f9ab21aa6ad95328c12.png [d6ba353ec28e02e4ba5a67d99c61225d.png]: /images/20220829/81a9fb496cae4487ab2b4f700722e9a7.png [5a768a46bf12620ea68f0d4b871d28df.png]: /images/20220829/5a04a1012bc24fce974e2e5a89d2fd7e.png [fd4381715fdc694c50abc963b0c588d1.png]: /images/20220829/07e0e91e138b464bbef8525bc500d71e.png [517e4ba339260cadca1f58a892a25ddc.png]: /images/20220829/09d1859e34f643fe9fe598de73e40dfb.png [4d1a865fc47bb1acefe81af4f319d9e4.png]: /images/20220829/b7b8c293df934358a5f0f8cd8f2d05fe.png [719846c3a16e9bb334bc48e5154782f7.png]: /images/20220829/b703f488a38f43c3b787b95197e34a13.png [24bd4feeec337f2b41c98a4a9faeffcc.png]: /images/20220829/bae77afb8ab545ca98ca4b81622541d2.png [12ee0dbe5ff1dc171303c06de69c439c.png]: /images/20220829/c52e5e1e0fa54937b49b086087b69714.png [62d5dc7591f9270ccc11bfd6c6ae8dd9.png]: /images/20220829/8415416521044ead8bafc2bdde3b5a49.png [e5b9ff321a276bcc1409a9d0d886dd39.png]: /images/20220829/c3cf88974cc4426698abebf298144cd8.png [b166348ca85a8659b81814fdfcff3103.png]: /images/20220829/393a4aad082d4f7499d38cf35c8c5f06.png [15d5d1d824db30c77e2374da326066e6.png]: /images/20220829/04f830282af4478da9e778e10886cb73.png [3c9b5faa39d75a57e2a7d9db761045d3.png]: /images/20220829/d3f6301cd34e4537a1c7c3934bd0b6fd.png [5be566278a85f1fcb4a45aa16040d96c.png]: /images/20220829/43a78271fa054d08b3fa8d6547fba431.png [538ff9a7a3317cfda4206a75d6003560.png]: /images/20220829/667c38b0ca1c469eb8c8625498cc24aa.png [2f6713e1f734fc4dc33a4b5f95e176ac.png]: /images/20220829/4437eed740944454a5659647a7d52843.png [3001ce47902e5b6d5808105dd64091f1.png]: /images/20220829/75a3762c5b204d5d82e8e056c30257a4.png [cf7061200c40605630a01ed36f686564.png]: /images/20220829/45ccd87291224c378935f59ddfc8c58e.png [7f2d06fd81b59dfee26c305816bbdd9b.png]: /images/20220829/66998436313443e189504e9e5b7e2503.png [fe93375dd3aa14be1d8f89bc2c13c7a2.png]: /images/20220829/c49049319d3847379e238abf74e45ed6.png [12d612da0cacb76e9cd7b94e28538d09.png]: /images/20220829/e660aa6fcc0e48d493cc50b053146a94.png [dc4a019086931121ae6cfd450046a3dd.png]: /images/20220829/c69e74f9596a4d6c8adb8e628c576466.png [912e69a395f7efc15ced52f5b8cc1976.png]: /images/20220829/e5df0c32e7b447ba94a4d62f44b78931.png [753a427eb5f50bdcd254d3e2c7b4cde0.png]: /images/20220829/cb463a13cec745a2958fd02cb36bcbc0.png [5e6357c42001ee72d6b3c1832b556f36.png]: /images/20220829/49e205eb3bf04654ac988afd16d38351.png [735070911aeb4561b7073f4971ba9767.png]: /images/20220829/a6e6e1b466c041cbada80a9e6c2fec87.png [04157bf01ef1779531ff274c69f475df.png]: /images/20220829/8289a5cee67945abbd44bbc791417a40.png [e34e0977e6e9d7fc68e2f442cdfc8ac8.png]: /images/20220829/8392e5e938bb4aa2833217b25343d8d4.png [145de900366efa84e3d0934f082984c0.png]: /images/20220829/46faa72a7bda40bb8ef75ffcb7211357.png [169047ebbb02a7453f045c59fc6cc851.png]: /images/20220829/3f0ff9ca844b4171a8452b6a88d6b73e.png [47ee9c40af7ac5307cba1a50b4d2adb2.png]: /images/20220829/db744f82a13f460ba27c8ba2dff36a87.png [864fbadb750a1b4ef43f7fc229b20a8e.png]: /images/20220829/e73c62e3477140249466978866d4a6cd.png [7491914d88034425921b8ba5fdcfdb56.png]: /images/20220829/8fb6fd8da3e94dc9bbefaf7cdae60d84.png [223fe5a43d61bc35d5aba86f626d5797.png]: /images/20220829/aeef0dbf8db94fe3af3f6b4af1768136.png [d88f915a50994a831be801bcd2d13b99.png]: /images/20220829/8c1ff61061ba40a18acff2ccc301f2a1.png [d9ad5fe778de7009baccf9b32b08267e.png]: /images/20220829/ddc44fdfe01143f5940c850094b9fde3.png [e38c94f2497a653ded4420f1c7886068.png]: /images/20220829/a4acc4246d1441d48a63691025a360fe.png
相关 漫画:什么是 “建造者模式” ? ![1d99ff493341c1d18d94900653d6ebd4.png][] ![d54da97711b0e6a9dedb3843e4d6bbf9.png][] —— 拼搏现实的明天。/ 2022年09月04日 01:47/ 0 赞/ 93 阅读
相关 建造者模式 定义 将一个复杂对象的构造与它的表示分离,是的同样的构建过程可以创建不同的表示。 类型:创建型 建造者模式与工厂模式有些类似: 建造者更注重:方法的调用顺序,关心创 「爱情、让人受尽委屈。」/ 2022年02月15日 19:25/ 0 赞/ 224 阅读
相关 建造者模式 [2019独角兽企业重金招聘Python工程师标准>>> ][2019_Python_] ![hot3.png][] 1、产品类 package com.hhdys r囧r小猫/ 2022年01月14日 22:37/ 0 赞/ 189 阅读
相关 建造者模式 建造者模式,又称为生成器模式,是一种较为复杂、使用频率不高的创建型模式。它为客户端返回的不是一个简单的产品,而是有多个部件组成的复杂产品。以手机为例,建造者模式返回的是一个完整 谁践踏了优雅/ 2021年12月10日 18:29/ 0 赞/ 194 阅读
相关 建造者模式 建造者模式 建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 柔光的暖阳◎/ 2021年09月29日 16:04/ 0 赞/ 276 阅读
相关 建造者模式 建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 一个 Buil 向右看齐/ 2021年09月17日 01:24/ 0 赞/ 307 阅读
相关 建造者模式 4.建造者模式 ![70][] class Customer { static void Main(string[] a 女爷i/ 2021年09月16日 23:52/ 0 赞/ 319 阅读
相关 建造者模式 建造者模式 1. 简介 2. 建造者模式介绍 2.1 定义 2.2 建造者模式的优点 2.3 建造者模式的缺点 ﹏ヽ暗。殇╰゛Y/ 2021年08月30日 22:18/ 0 赞/ 435 阅读
相关 建造者模式 一 点睛 将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naG 怼烎@/ 2021年07月24日 18:01/ 0 赞/ 371 阅读
相关 建造者模式 造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 一个 Bu... 小灰灰/ 2020年06月13日 05:36/ 0 赞/ 702 阅读
还没有评论,来说两句吧...