Dubbo源码系列更新两篇文章

This commit is contained in:
youthlql
2021-09-13 00:08:48 +08:00
parent 0c16e8d9b1
commit 6eda136890
18 changed files with 2380 additions and 146 deletions

View File

@@ -8,7 +8,7 @@ categories:
- 03.创建型
keywords: 设计模式,单例
description: 详解了单例设计模式。
cover: 'https://cdn.jsdelivr.net/gh/youthlql/lqlp@master/design_patterns/logo.jpg'
cover: 'https://unpkg.zhimg.com/youthlql@1.0.0/design_patterns/logo.jpg'
abbrlink: b5a1ed4a
date: 2021-06-26 21:51:58
---

View File

@@ -10,7 +10,7 @@ categories:
- 03.创建型
keywords: 设计模式,工厂,建造者,原型
description: 详解常用的工厂模式和建造者模式,以及不常用的原型模式
cover: 'https://cdn.jsdelivr.net/gh/youthlql/lqlp@master/design_patterns/logo.jpg'
cover: 'https://unpkg.zhimg.com/youthlql@1.0.0/design_patterns/logo.jpg'
abbrlink: ba432704
date: 2021-06-27 00:51:58
---
@@ -727,7 +727,7 @@ public class BeansFactory {
1. 在平时的开发中,创建一个对象最常用的方式是,使用 new 关键字调用类的构造函数来完成。我的问题是,什么情况下这种方式就不适用了,就需要采用建造者模式来创建对象呢?你可以先思考一下,下面我通过一个例子来带你看一下。
2. 假设有这样一道设计面试题:我们需要定义一个资源池配置类 ResourcePoolConfig。这里的资源池你可以简单理解为线程池、连接池、对象池等。在这个资源池配置类中有以下几个成员变量也就是可配置项。现在请你编写代码实现这个 ResourcePoolConfig 类。
<img src="https://cdn.jsdelivr.net/gh/youthlql/lqlp@master/design_patterns/creational/03.02/0001.png" />
<img src="https://unpkg.zhimg.com/youthlql@1.0.0/design_patterns/creational/03.02/0001.png" />
@@ -1003,7 +1003,7 @@ r.setHeight(3); // r is valid
2. 如果你熟悉的是 Java 语言,可以直接使用语言中提供的 HashMap 容器来实现。其中HashMap 的 key 为搜索关键词value 为关键词详细信息(比如搜索次数)。我们只需要将数据从数据库中读取出来,放入 HashMap 就可以了。
3. 不过,我们还有另外一个系统 B专门用来分析搜索日志定期比如间隔 10 分钟)批量地更新数据库中的数据,并且标记为新的数据版本。比如,在下面的示例图中,我们对 v2 版本的数据进行更新,得到 v3 版本的数据。这里我们假设只有更新和新添关键词,没有删除关键词的行为。
<img src="https://cdn.jsdelivr.net/gh/youthlql/lqlp@master/design_patterns/creational/03.02/0002.png"/>
<img src="https://unpkg.zhimg.com/youthlql@1.0.0/design_patterns/creational/03.02/0002.png"/>
@@ -1150,15 +1150,15 @@ public class Demo {
我们来看,在内存中,用散列表组织的搜索关键词信息是如何存储的。我画了一张示意图,大致结构如下所示。从图中我们可以发现,散列表索引中,每个结点存储的 key 是搜索关键词value 是 SearchWord 对象的内存地址。SearchWord 对象本身存储在散列表之外的内存空间中。
<img src="https://cdn.jsdelivr.net/gh/youthlql/lqlp@master/design_patterns/creational/03.02/0003.png" />
<img src="https://unpkg.zhimg.com/youthlql@1.0.0/design_patterns/creational/03.02/0003.png" />
浅拷贝和深拷贝的区别在于浅拷贝只会复制图中的索引散列表不会复制数据SearchWord 对象本身。相反深拷贝不仅仅会复制索引还会复制数据本身。浅拷贝得到的对象newKeywords跟原始对象currentKeywords共享数据SearchWord 对象),而深拷贝得到的是一份完完全全独立的对象。具体的对比如下图所示:
<img src="https://cdn.jsdelivr.net/gh/youthlql/lqlp@master/design_patterns/creational/03.02/0004.png"/>
<img src="https://unpkg.zhimg.com/youthlql@1.0.0/design_patterns/creational/03.02/0004.png"/>
<img src="https://cdn.jsdelivr.net/gh/youthlql/lqlp@master/design_patterns/creational/03.02/0005.png" />
<img src="https://unpkg.zhimg.com/youthlql@1.0.0/design_patterns/creational/03.02/0005.png" />