常见设计模式总结
# 常见设计模式总结
# 谈谈你对设计模式的理解?
设计模式是一种被广泛应用的解决问题的经验总结,它提供了一套可复用、可扩展、易于维护的解决方案。设计模式可以帮助我们更好地组织代码,提高代码质量和可读性。
由以前的程序员在实际工作中反复使用,总结得出的经验,形成的使用的模式。
有 7 个常用的软件设计原则
开闭原则 -- 对扩展开放,对修改关闭
你要对某个类进行加功能的时候,直接去继承这个类写一个新的类来使用,而不是在原有类上做修改
单一职责原则 -- ⼀个类只负责⼀个功能领域中的相应职责
里氏替换原则 -- 所有引用基类的地方必须能透明地使用其子类的对象
依赖倒置原则 -- 依赖于抽象,不能依赖于具体实现
接口隔离原则 -- 类之间的依赖关系应该建立在最小的接口上
合成/聚合复用原则 -- 尽量使用合成/聚合,而不是通过继承达到复用的目的
最少知识原则 或者 迪米特法则 -- 一个软件实体应当尽可能少的与其他实体发生相互作用
主要有三大分类
- 创建型模式
- 结构型模式
- 行为型模式
# 有哪些常见的设计模式?
常见的设计模式包括 单例模式、工厂模式、观察者模式、策略模式、模板方法模式 等。
# 单例模式了解么?说⼀下单例模式的使用场景。手写⼀个单例模式的实现。
什么是单例模式?
单例模式是一种常见的(创建型)设计模式,它的作用是确保一个类只有一个实例,并提供一个全局的访问点。
在一些需要频繁创建对象的场景下,使用单例模式可以有效地减少系统的内存开销和性能损耗。
单例模式的使用场景
单例模式的使用场景包括:
- 当类的实例化过程比较耗时或者需要消耗较多资源时,使用单例模式可以避免重复创建实例,从而提高系统性能。
- 当需要一个共享访问点来管理全局变量时,使用单例模式可以确保数据的一致性和可靠性。
- 当希望避免多个实例之间的冲突和竞争时,使用单例模式可以有效地避免这些问题。
代码实现
下面是一个简单的单例模式的实现:
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}// 只有在第一次调用getInstance()方法时才会创建实例
2
3
4
5
6
7
8
9
10
这是懒汉式单例模式的基本实现,在这个实现中,我们使用了一个静态变量 instance 来保存单例实例,getInstance()
方法用来获取实例。
在第一次调用
getInstance()
方法时,instance 还没有初始化,会创建一个新的实例并返回,以后再次调用
getInstance()
方法时,直接返回已经创建好的实例。这样就可以保证整个系统中只有一个 Singleton 实例存在。
饿汉式单例模式:
public class Singleton { private static Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstance() { return instance; } }
1
2
3
4
5
6
7在这个实现中,我们直接在静态变量中初始化 Singleton 实例,并在 getInstance() 方法中返回该实例。因为 instance 在类加载时就已经创建好了,所以不存在线程安全问题。
这种实现方式的缺点是,如果 Singleton 实例的初始化需要消耗较多的资源或时间,会影响系统的性能,而且如果 Singleton 实例在整个系统中没有被使用到,也会浪费系统的资源。
# 观察者模式了解么?说⼀下观察者模式的使⽤场景。
⼯⼚模式了解么?说⼀下⼯⼚模式的使⽤场景。
责任链模式了解么?
哪些开源项⽬(Netty、MyBatis)中⽤到了责任链模式?怎么⽤的?
SOL ID 原则了解么?
简单谈谈⾃⼰对于单⼀职责原则和开闭原则的理解。
阅读 Spring 源码的时候什么设计模式最让你影响深刻?能简单讲讲吗?