前言
因为我口头表达能力比较薄弱,所以都会想在脑海中模拟出一个虚拟对象,然后进行对话,类似费曼学习法里面的以教代学。
自己抛出问题,然后自己进行解答,一直到无法解答为止,就能够清晰地知道自己薄弱地地方并且能够很好的组织自己的口语表达能力。
记忆宫殿图是我自己对他的命名,也是我学习经验积累出的一个产物。具有水平和垂直层次性的逻辑图。能够很好对某个知识点,进行水平扩展和垂直深度进行讲解。
记忆宫殿图
思维导图和记忆宫殿图,记忆宫殿图能够帮助我们横向和纵向清晰地、全面地阐述知识点。
举个例子:
当我需要阐述优秀的设计模式是如何体现的时候,我可以很快地跟面试官先提出我的一个大的方向:
- 代码的复用性
- 代码的可扩展性
然后先对代码的复用性进行论证:
优秀设计模式可以提高代码的复用性和可扩展性。(水平扩展)
对于代码的复用性来说,复用层次最小可以是类库、容器和集合类,最大也可以整个框架,但是风险也会随之变大。而设计模式是两者的中间比保守安全的复用层次。(垂直扩展)
像一些比如组件之间的耦合、面向实现而非面向抽象的代码又或是最直接的硬编码风格,都是降低我们代码的复用性(水平扩展)
最后可扩展性也是相同的阐述道理。
相信这样能够让面试官既能看出你知识点水平扩展的广度,也是能看出你对知识点的理解深度。
设计模式
回到我们今天的主题,设计模式,4人帮总结出的设计模式共有23种,在 《深入设计模式》 这本书种,根据每个模式的使用场景和解决问题的手法分成了三个类:创建型模式、结构性模式、行为式模式。
每个模式之间,又可以是搭配进行使用,比如策略模式经常和工厂模式进行搭配使用,工厂模式负责创建策略类,而策略类负责算法具体逻辑实现。
创建型模式
创建型模式针对的是对象的创建,围绕着对象的创建流程进而设计的模式
针对单个对象的创建
生成器模式:Builder
加强构造函数
对于单个对象的创建,我们知道对象创建会调用构造函数,而复杂的对象可能构造函数中会有多个参数,进行初始化。
问题来了,有时候我只需要其中某个参数,但是我又不得不也把其他一大串参数“无意义”的参数填上
生成器模式Builder就是针对对象的构造函数设计的一种模式。相信你可能没有学过生成器模式,但是在写代码的时候已经见识过他的强大之处。
生成器的核心:把构造函数分步骤地实现。
把一只大象放进冰箱需要多少步骤?
生成器模式也是同样的道理,我只需要对我有意义的构造参数进行设值,其他的参数可以不管。
所以说生成器模式是对构造函数的一个强化模式。
原型模式:clone
复制对象
有时候我们拿到了对象之后,想要对他进行加工修改,但是又不能直接原地修改,因为这样会污染到原对象。因此我们希望有一个跟原对象一摸一样的“替罪羔羊”,类似拷贝副本的一种概念。
生成某个对象的复制品,最简单的,就是把先生成这个类的对象,然后把成员变量都复制一样即可。
但是并非所有的成员对象都可以用这种直接复制的方式进行赋值,比如:
- 成员对象是私有变量的,那么它本身对外是不可见的,自然无法读取值来赋值。
- 必须知道对象所属的类,才能创建复制品。有可能他成员对象是来自第三方的。
最经典的原型案例,莫过于Java的集合类了。
每个集合都有一个clone()的成员方法,通过调用它,就会return回一个克隆对象。
单例模式:Singleton
非常经典,也是用途应该算是最常见的设计模式,主要是解决对象复用的问题。
创建对象和销毁对象同样是需要消耗资源的,这就好比是线程一样,多线程并非一定会比单线程会快,因为多线程会有线程切换的损耗。
对于某些特有的对象,我们无需对他进行频繁地创建,又或许是我们想要让他具有全局唯一性的对象。我们可以使用单例对象,来保证所有的线程拿到的都是同一个对象(当然这里会有线程安全的问题,需要我们去解决)。
常见的单例设计模式还分很多:
- 懒汉:调用getInstance()的时候才进行创建。
- 饿汉:不调用也直接创建。
- DCL:两个锁
- 静态内部类:内部有static修饰的类
由于篇幅原因,这里就不过多介绍每一种具体的单例模式,感兴趣的读者可以自行搜索。
针对多个对象的创建
工厂模式:Factory
我们要根据客户端的业务需求,去创建满足业务的对象。但是我们一般情形下,并不知道客户端传过来的对象是什么,所以我们想要有一个办法,去适配客户端所有传过来类型的对象。
抽象工厂模式:AbstractFactory
在工厂方法的基础上,多加了一层抽象层,这层抽象层是加在工厂之上的。
工厂模式我们是确定了要生产哪种对象,比如是车还是船。但是有时候我们并不知道要生产哪类对象,比如是法拉利还是五菱宏光。
这时候我们需要利用抽象工厂去找到造船工厂抑或是造车工厂,然后再根据找到的车工厂进行生产法拉利还是五菱宏光。
详细笔记
详细的笔记连接:
www.yuque.com/docs/share/…