作者 | 东风玖哥,小灰

来源 | 程序员小灰(ID:chengxuyuanxiaohui)

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

———————————

首先,我们来定义一个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();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);  }}

/**将指定的字符串追加到此字符序列*/@Overridepublic StringBuilder append(CharSequence s) {    super.append(s);// 实现过程略    return this;}/**将此字符序列用其反转形式取代*/@Overridepublic 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);

☞让汽车软件进入 iPhone 时代!
☞国内首家!携程每周两天可在家“躺平”,76% 的员工主动报名
☞苹果新功能惹众怒,4000 多家组织和个人签署公开信,敦促苹果放弃“儿童安全”功能
☞Windows 11 再惹“众怒”!网友:微软就是逼我去买新电脑!
☞程序员因开发速度太慢而遭公司起诉,索赔金额高达90万!

漫画:什么是 “建造者模式” ?相关推荐

  1. GOF23设计模式(创建型模式)建造者模式

    使用场景: 我们要建造一个复杂的产品,比如生产一辆汽车.一部手机,这都是由很多零部件组成的,这时候就需要用到我们的建造者模式,将每个零部件分别生产,然后再装配~~ 以下,我将以一个手机的生产过程为实例 ...

  2. 设计模式 之美 -- 建造者模式

    文章目录 1. 解决问题 2. 应用场景 3. 实现 C语言实现 C++实现 4. 缺点 1. 解决问题 描述如下场景: 类的数据成员很多(8个以上),当我们进行初始化的时候放在初始化列表中,影响类的 ...

  3. 设计模式之建造者模式(生成器模式、Builder)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.FactoryMethod(工厂方法模式):2.Abstract Factory(抽象工厂模式):3.Sin ...

  4. 动态表单构建器——建造者模式

    在编写一个弹出框时,它可以包含确定按钮,取消按钮,标题栏,关闭按钮,最小化按钮,内容,最大化按钮等内容,但这些内容在不同的需求下又不是必须存在的,不同的需求需要对这些组件自由组合,显然每次组合都要重复 ...

  5. Python设计模式-建造者模式

    Python设计模式-建造者模式 代码基于3.5.2,代码如下; #coding:utf-8 #建造者模式 class Burger():name = ""price = 0.0d ...

  6. 设计模式-建造者模式(05)

    定义 建造者模式(Builder Pattern)也叫做生成器模式.英文原话是:Separate the construction of a complex object from its repre ...

  7. php设计模式 - 建造者模式

    为什么80%的码农都做不了架构师?>>>    <?php /*** 建造者模式* * 将一个复杂对象的构建与它的表示分离,使用同样的构建过程可以创建不同的表示 */ clas ...

  8. java中自造类是什么意思_Java建造者模式是什么?如何实现?(附代码)

    本篇文章给大家带来的内容是关于Java建造者模式是什么?如何实现?(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 建造者模式 一.什么是建筑者模式? 建造者模式(Build ...

  9. 建造者模式java_java设计模式3——建造者模式

    java设计模式3--建造者模式 1.建造者模式介绍: 建造者模式属于创建型模式,他提供了一种创建对象得最佳方式 定义: 将一个复杂对象的构建和与它的表示分离,使得同样的构建过程可以创建不同的表示 主 ...

最新文章

  1. C++的STL队列实现栈
  2. Interviews(内连接,左外连接,分组、聚合)
  3. python自动抓取指定信息_使用python自动转发抓取的网页信息
  4. RHEL 5服务篇—使用Apache搭建Web服务(一)
  5. 【测】测试用MetaWeblog访问博客园
  6. linux使用find命令_如何在Linux中使用FIND
  7. ERROR! The server quit without updating PID file (/usr/local/var/mysql/apple,卸载,重装一个,我的方案
  8. post-commit hook failed (exit code 255) with no output 解决方案
  9. 【冷笑话】看谁跑的快?
  10. BZOJ:1001狼抓兔子
  11. Vijos P2010 回文日期【回文+日期计算】
  12. Excel数据导入到oracle
  13. Python 学习资源汇总
  14. php upload 上传类,发布一个PHP的文件上传类——Uploader
  15. 单极性SPWM的两种控制方法与过零点输出特性分析比较
  16. 随机矩阵stochastic matrix和双随机矩阵 doubly stochastic matrix 和bistochastic matrix
  17. csp 4-2 卖菜 (300 分)
  18. android xml绘制图标,android – 如何为图标制作XML文件
  19. [转]有关FMS(FCS)设置
  20. 用魔法打败魔法!这件毛衣让摄像头看不到你;两款酷炫的AI写作软件;基于深度学习扩散模型的蛋白质设计;Codon开源Python编译器;基于AI生成连贯的剧本 | ShowMeAI资讯日报

热门文章

  1. 重磅!上海交通大学取消博士论文发表要求!
  2. 【超越EfficientNet】无需注意力,Transformer结合视觉任务实现新SOTA
  3. mysql中如何设置时区_如何设置MySQL的时区?
  4. RPA有哪些优点和缺点?
  5. SAP PM入门系列3 - 设备主数据里无‘检验类型‘栏位,那何处定义维护订单可以触发检验批?
  6. SAP PP COR3不能看工单后续的备料TO单号?
  7. SAP Web Intelligence初探
  8. SAP SD基础知识之交货中的控制元素
  9. 强化学习在携程酒店推荐排序中的应用探索
  10. SAP WM LRFMD中Variant参数的影响初探