mirror of
https://github.com/youthlql/JavaYouth.git
synced 2026-03-14 05:43:50 +08:00
Dubbo源码系列更新两篇文章
This commit is contained in:
@@ -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
|
||||
---
|
||||
|
||||
@@ -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" />
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user