23种设计模式(常见面试题)
1.什么是设计模式?
答:
设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。
2.你当初为什么要学习设计模式?
答:
- 为了看懂源代码:如果不懂设计模式的话,去看Jdk、Spring、SpringMVC、IO等的源码,会感到很迷惑,什么都看不懂。
- 为了看看前辈们的代码:比如去工作不一定是直接分配给我新项目,很有可能是前辈的项目,如果他们用了设计模式,而自己不会,那会面临很大问题。
- 为了敲自己的理想中的优质代码:生活需要仪式感,需要认真生活,对于代码,也是一样,自己开发的项目就想把项目当成自己的大宝贝一样。
3.简单说一下设计模式?你都知道哪些?
答:
- 设计模式分为23种
- 总体来说可以分为三大类:1.创建型模式( Creational Patterns )、2.结构型模式( Structural Patterns )、3.行为型模式( Behavioral Patterns )
- 关注点:
1. 创建型模式:关注对象的创建
2. 结构型模式:关注类与对象之间的组合
3. 行为型模式:关注对象之间的通信- 分类:
1.创建型模式:
(1)单例模式
(2)工厂模式
(3)抽象工厂模式
(4)建造者模式
(5)原型模式
2.结构型模式
(1)代理模式
(2)适配器模式
(3)桥接模式
(4)装饰模式
(5)外观模式
(6)享元模式
(7)组合模式
3.行为型模式
(1)模板方法模式
(2)策略模式
(3)命令模式
(4)责任链模式
(5)状态模式
(6)观察者模式
(7)中介者模式
(8)迭代器模式
(9)访问者模式
(10)备忘录模式
(11)解释器模式
4.能写两个单例模式吗?
答:
饿汉式:
public class Singleton {
// 直接创建对象
public static Singleton instance = new Singleton();
// 私有化构造函数
private Singleton() { }
// 返回对象实例
public static Singleton getInstance() {
return instance;
}
}
懒汉式:
public class Singleton {
// 声明变量
private static Singleton singleton = null;
// 私有构造函数
private Singleton() { }
// 提供对外方法
public static Singleton getInstance() {
// 两次判空是因为,等待锁时可能已经被人初始化过了,如果不再判断可能会重复初始化。
if (singleton == null) {
synchronized(this) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
5.什么是单例?(或单例模式的核心作用是什么?)
答:
保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。
6.哪些地方用到了单例模式?
答:
- 应用程序的日志应用,一般是单例模式实现。
- 多线程的线程池的设计,一般也是采用单例模式,因为线程池要方便对池中的线程进行控制
- Windows的(任务管理器或者回收站),是单例模式,他不能打开俩个
- 在项目种加载配置文件的类,一般是单例。
- 一个项目的数据库连接池,一般是单例模式。因为数据库连接是一种数据库资源,每次都new的话,很消耗资源。
- 在Spring中,每个bean默认就是单例的,这样做的优点是spring容器可以管理。
- springmvc中,控制器对象是单例。
- 在servlet中,每个servlet是单例。
- 计数器使用的也是单例,然后保证同步访问。