首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何摆脱这个Builder实现中的instanceof

要摆脱Builder实现中的instanceof,可以使用多态性。具体来说,可以使用接口和抽象类来实现。

首先,可以定义一个接口或抽象类,该接口或抽象类包含了所有Builder实现中需要的方法。然后,可以让每个Builder实现该接口或抽象类,并实现其中的方法。

在使用Builder实现时,可以将其定义为接口或抽象类的类型,而不是具体的Builder实现。这样,就可以避免使用instanceof来判断Builder实现的类型,而是使用多态性来调用其方法。

例如,假设有一个Builder接口,其中包含了一个build()方法:

代码语言:java
复制
public interface Builder {
    public Object build();
}

然后,可以让每个Builder实现该接口,并实现其中的build()方法:

代码语言:java
复制
public class ConcreteBuilder1 implements Builder {
    public Object build() {
        // 实现Builder1的build()方法
    }
}

public class ConcreteBuilder2 implements Builder {
    public Object build() {
        // 实现Builder2的build()方法
    }
}

在使用Builder实现时,可以将其定义为Builder类型,而不是具体的Builder实现:

代码语言:java
复制
public class Director {
    private Builder builder;

    public Director(Builder builder) {
        this.builder = builder;
    }

    public Object construct() {
        return builder.build();
    }
}

这样,就可以避免使用instanceof来判断Builder实现的类型,而是使用多态性来调用其build()方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

技巧 | C++中实现类似instanceof的方法

前言 C++有多态与继承,但是很多人开始学习C++,有时候会面临一个常见问题,就是如何向下转型,特别是不知道具体类型的时候,这个时候就希望C++ 可以向Java或者Python中有instanceof这个函数...,可实际上C++中没有。...但是别着急,其实C++中有两种简单的方法可以实现类似Java中的instanceof的功能。 在 C++ 中,确定对象的类型是编程中实际需求,使开发人员能够做出动态决策并执行特定于类型的操作。...无论是在编译时检查类型,还是在运行时动态标识对象类型,C++ 都提供了强大的机制来获取类型信息 使用typeid.name()方法 寻找实例的类类型,代码演示如下: 使用std::is_same方法 代码实现与运行效果如下...: 使用dynamic_cast dynamic_cast方法转型是C++中一种非常杰出的方法。

20210
  • Go中的循环依赖:如何解决这个问题

    作为一个 Golang 开发,你可能在项目中遇到过包的循环依赖问题。Golang 不允许循环依赖,如果检测到代码中存在这种情况,在编译时就会抛出异常。本文会讨论循环依赖是如何发生的以及如何处理。...比起代码执行速度,Go语言更关注如何快速编译(甚至愿意牺牲一些运行时性能来换取更快的构建速度)。...为什么Go中不显示导致错误的原因呢?原因是在循环依赖中并不是只有一个源文件。 但Go语言会在报错信息中告诉你导致问题的package名,因此可以通过包名来解决问题。...但很多时候它增加了代码的重复性,要使用这种方法的话需要牢记你的代码结构(原文没有提供三个包的例子,可以在这个库中查看三个包的例子:https://github.com/yigenshutiao/Go-design-codes...这个特殊指令的作用域不是紧跟的下一行代码,而是在同一个包下生效。

    11.3K21

    Elasticsearch 8.X:这个复杂的检索需求如何实现?

    3、实现讨论 针对需求 2,这个设置权重就可以实现。...针对需求 3,这个 TF-IDF 机制决定的,检索后结果自然满足,也就是评分逻辑就是基于这个实现的(后续升级为BM25模型,原理一致),咱们不用动就可以。 针对需求 4,加个时间排序就可以。...更合适的方式可能是结合应用层的逻辑来实现这一需求。 一般遇到类似问题,就得有理有据的和产品经理讨论清楚需求,不要任凭产品经理“瞎指挥、瞎忽悠”。 那么借助脚本如何实现呢?...2 使用Java的indexOf方法,找到"小学"在"title"中的位置,并将这个位置存储在indexSchool变量中。...3 使用同样的方法,找到"天天"在"title"中的位置,并将这个位置存储在indexKeyword变量中。 4 判断两个关键字的位置:如果"小学"在"天天"之前,返回1。

    50760

    为什么实现 .NET 的 ICollection 集合时需要实现 SyncRoot 属性?如何正确实现这个属性?

    不过这个设计让线程安全的访问有集合的实现方转嫁到了调用方,导致要么很难实现,要么很难调用。...虽然泛型版本的 ICollection 已经改进了设计,不再引入 SyncRoot 这样的属性到接口中,但如果我们在某些场景下需要实现 ICollection 非泛型集合时,如何正确实现 SyncRoot...---- 先上结论: —— 不可能正确实现 SyncRoot 模式 在多线程程序设计中,为了在保证线程安全的同时避免死锁,不应该公开同步锁。...结合 .NET Core 源代码中的一些常用写法,我给出一个推荐的 SyncRoot 模式的写法: // Is this List synchronized (thread-safe)?...然而这个属性都是 public 了,不管返回什么,与 this 还有什么区别…… 关于为什么同步时不应该返回 this 或者返回公开的对象,原因可以看我的另一篇博客: 为什么不应该公开用来同步的加锁对象

    86830

    PostgreSQL中WaitEventSet的超时如何实现

    PostgreSQL中WaitEventSet的超时如何实现 WaitEventSet的等待超时如何实现?...我们了解到,它和epoll有关,首先先了解下epoll_wait这个函数: int epoll_wait( int epfd,//epoll_create函数返回的epoll实例的句柄 struct...Epoll将发生的事件集合从内核复制到该数组 int maxevents, //本次可以返回的最大事件数目 int timeout//超时时间。...-1:阻塞;0:不阻塞;>0:等待超时时间,单位ms ); 返回值:0:表示等待超时;>0:返回需要处理的事件数目;-1:出错 错误标签: EBADF:epfd是一个非法的文件描述符 EFAULT:事件指向的内存区域无法使用写权限访问...EINTR:请求的任何事件发生前或者超时到期前,调用被信号处理程序中断 EINVAL:epdf不是epoll文件描述符,或者maxevents <=0 WaitEventSetWait if (timeout

    23220

    JS中setTimeout是如何实现的

    我们知道 Javascript引擎是单线程的,而setTimeout方法的作用是延后执行目标代码,同时还可以继续往下执行 setTimeout是如何实现的?...这涉及到了浏览器内核的事件循环模型,在Javascript引擎之外,有一个任务队列,当执行到setTimeout时,延时方法会交给内核其他模块处理(与执行引擎主线程独立),当延时方法到达触发条件,这一延时方法被添加至任务队列里...,执行引擎在主线程方法执行完毕后,会从任务队列中顺序获取任务来执行,这一过程是一个不断循环的过程,称为事件循环模型 下面通过一段示例代码,看一下整个执行过程 console.log('1'); setTimeout...(5)执行引擎的执行栈为空后,引擎开始轮询检查任务队列是否有任务需要被执行,就检查到延时方法test,于是将延时方法加入执行栈,test方法调用了log()方法,于是又将log(2)方法入栈执行,输出2

    3.4K80

    Java中的Lambda是如何实现的

    在上面的字节码中,我们可以看到一个名为 lambdamain0 的方法,该方法是在编译阶段自动生成的,其对应于示例源码中的lambda方法体。...在main方法的字节码中,invokedynamic是整个lambda实现的关键,不过由于该字节码在JVM中的实现逻辑非常复杂,在这里我们就不看具体代码了,只说下大致思路。...该字节码的最终目的是为了创建一个对象,且该对象要实现java.util.function.Consumer接口,这样这个对象才可以赋值给上面示例源码中的 Consumer c 变量。...那这个对象对应的类是哪里来的呢?对,也是动态生成的。...依据上面的示例,我们再来总结下lambda是如何实现的: 在编译阶段,javac会自动生成一个lambdamain0方法,该方法对应了lambda的方法体。

    1.1K30

    通过照片内容搜图,Facebook这个新技能是如何实现的?

    新功能详解 为了实现这个功能,Facebook使用了上百万张照片来训练深度神经网络,好在他们的平台上已经有数十亿张加了标题的图片。...将搜索词和照片匹配起来之后,Facebook的模型使用图片本身和原有搜索中的信息来对搜索结果进行排序,另外,他们在排序中还考虑到了照片的多样性,以确保用户不会连续看50张照片都是同一个东西,只在焦距和角度上略有不同...这一技术可能用在个人情境中,比如说帮用户搜索朋友的视频,找到她吹灭生日蜡烛的那一刻;也可能用于商业情境中,有助于提升Facebook信息流广告营收的天花板。...最终,我们将看到一个完全整合的系统,在这个系统中,我们可以提取信息,比如说从视频中搜索一件你非常喜欢的裙子,然后把它链接到市场上的商品,甚至把你和广告合作商直接连接起来以增进用户体验、保持营收增长。...去年四月推出时,这个为图片生成文字描述的工具只能告诉用户图片里有等、台阶等物体,但不太会描述物体的动作。 为了解决这个问题,Facebook的一个团队手工标注了平台上的130000张照片。

    4.9K100

    MySQL中insertOrUpdate的功能如何实现的

    insertOrUpdate 在我们日常使用中比较常见,那么它是如何实现的呢,不知道大家有没有考虑过呢? 在 MySQL 中,可采用INSERT INTO ......ON DUPLICATE KEY UPDATE语句实现 insertOrUpdate 功能。 值得留意的是,在出现重复键时,会在先前索引值和当前值之间添加临时键锁,这可能导致死锁。...ON DUPLICATE KEY UPDATE语句,如果数据库中已存在具有相同唯一索引或主键的记录,则更新该记录。其底层原理和执行流程如下: 检查唯一索引或主键:执行INSERT INTO ......在此过程中,数据库会检查表中是否存在与新插入行具有相同的唯一索引或主键的记录。 冲突处理:如果不存在冲突的唯一索引或主键,新行将被正常插入。...这是因为 MySQL 在尝试插入新记录时,会先分配一个新的自增主键值,无论后续是插入成功还是执行更新操作,这个主键值都已经被分配并且会增加。

    47610

    Github 精选 | 如何干掉 shape.xml 文件?

    除了 xml 中的基本使用外,BackgroundLibrary 还提供了完善的配套支持。 可以通过代码直接生成 Drawable 。...//设置button圆角背景 Drawable drawable = new DrawableCreator.Builder().setCornersRadius(dip2px(20))...提供了预览功能,但是需要把原来的View换成框架内对应的BLView,这存在一定的成本 。 综合来说,还是一个相当不错的工具库,可以摆脱繁杂的 shape.xml 编写工作,但并不可能完全替代。...原理 BackgroundLibrary 的原理还是很巧妙的。两个关键词:自动初始化、自动解析属性 。你可以先不往后看,停下来思考一下如何实现。...} return inflater; } ... } 如果你知道 AppcompatActivity 是如何 在运行时自动把 xml 文件中的 TextView 转换成 AppcompatTextView

    53520

    微服务心跳监测机制讲解与实现,与面试过程中如何回答这个问题

    微服务心跳监测机制讲解与实现,与面试过程中如何回答这个问题 心跳检查的基本原理 心跳检查是通过定期发送和接收小的探测消息来监控服务实例的健康状态。...示例:使用Spring Cloud Eureka实现心跳检查 我们将使用Spring Cloud Eureka作为服务注册中心,演示如何实现心跳检查机制。以下是一些关键步骤: 1....} } 通过在服务中添加此监听器,我们可以在每次收到心跳信号时执行自定义的处理逻辑。...,如时间戳、实例ID等 } } 通过在心跳事件中调用logHeartbeat方法,我们可以在日志中轻松地跟踪每个服务实例的状态。...,并且更新服务实例的健康状态,如果在这个过程中微服务的服务实例连续一段时间未发送信号,注册中心就会标记这个实例为不健康,并触发响应的处理机制。

    10510

    如何实现VM框架中的数据绑定

    作者:佳杰 本文原创,转载请注明作者及出处 如何实现VM框架中的数据绑定 一:数据绑定概述 视图(view)和数据(model)之间的绑定 二:数据绑定目的 不用手动调用方法渲染视图,提高开发效率;...发布订阅模式(backbone.js用到); 2.数据劫持(vue.js用到); 3.脏值检查(angular.js用到); 六:model > view数据绑定demo讲解 (如何实现数据改变...,defineProperty用于“监控model", dom元素执行"订阅"操作,给model中 的属性绑定function;model中属性变化的时候,执行"发布"这个操作,执行之前绑定的那个...,但又不想费劲地查找dom元素再去修改元素的值, 这种情况下,可以用demo中的数据绑定,只需修改数据的值,就实现了页面元素重新渲染 请看下面的gif动画中展示的,只要修改data.age和data.name...结束语 本demo只是简单实现数据绑定,很多功能并未实现,只是提供一种思路,抛砖引玉; 如果对上述代码中的Observer类的代码不是很理解,可以先了解下观察者模式以及实现原理; 最后,感谢大家的阅读

    3.2K80

    android中内存缓存是如何实现的

    先找到数组中对应的index,然后把数据放到链表的最后位置。由于是双向链表,那么就等于放在header.prv 2.获取一个数据。先找到数组中对应的index,然后找到数据所在的位置。...如果是按照读取顺序来排序的,那么还要将这个节点放到双向链表的最后一位(这个特性,可以实现LRU算法) public class LruCache { //map用来存储外界的缓存对象...key == null"); } V mapValue; synchronized (this) { //设置为true了,还要将这个节点放到双向链表的最后一位...当添加缓存时,先添加数据,再把对应的entry挪到双向链表的末尾。如果size超过最大值,就删除header.next 当获取缓存时,先获取数据。...由于设置为true,那么也会将对应的entry挪到双向链表的末尾

    1K60

    库中是如何实现string类的?

    个人主页: :✨✨✨初阶牛✨✨✨ 推荐专栏1: C语言初阶 推荐专栏2: C语言进阶 个人信条: 知行合一 本篇简介:>:讲解如何模拟实现C++中的string类....申请一块为_capacity+1大小的空间.(+1是为了存储'\0') 将字符串中的值按字节拷贝至string类中的_str....代码实现: //全缺省构造函数,,默认初始化为空字符 string(const char* str = "")//无参也是调用这个 { _size = strlen(str);...迭代器的作用类似于指针,可以通过解引用操作符(*)获取容器中的元素值,也可以通过自增操作符(++)移动迭代器指向下一个元素。迭代器可以访问容器中的元素,也可以修改容器中的元素值。...(*this == s); } 博主能力有限,无法严格按照库中的方法实现,比如采用内存池等技术,还有部分函数并未实现,模拟实现string的目的只是为了我们更好的理解string类,而不是真正让我们去写一个库函数

    17610
    领券