**我觉得面试官问这个问题可以说是挖了个大坑,直接说单例、工厂、代理、适配器、观察者、外观、策略、建造者、享元、生产者和消费者等等等,我觉得你说出这个模式可能并不够,面试官肯定会问你用过哪些呀,所以我觉得关于设计模式不要贪多,重点了解几个常用,然后先说面向对象的solid,然后其他的设计模式也就是基于这几个原则来组合出来
**
SOLID(内功,以后写代码都要这么写)
- S 单一职责:一个类只做他该做的事情(高内聚)。在面向对象中,如果只让一个类完成它该做的事情,而不涉及与它无关领域就是践行了高内聚的原则,这个类就只有单一职责
-
O 开放封闭:软件实体应当对扩展开发,对修改关闭。要做到开闭需要做到一些点
1.抽象是关键,一个系统中如果没有抽象类或者接口也就是没有扩展点
2.封装可变性,将系统中的各种可变因素封装在一个继承结构中,如果多个可变因素混杂在一起,系统将变得复杂而乱,错误不小心修改的话就会产生很大的损失,使用接口扩展而不要去修改源码 - L 里氏变换:任何时候都可以使用子类型去替换掉父类型。子类一定是增加父类的能力而不是减少父类的能力,因为子类比父类的能力更多,把能力多的当成能力少的没有问题
- I 接口隔离:接口要小而且专,不能大而全,臃肿的接口是对接口的污染,既然接口表示能力,那么接口就应该只描述一种能力,接口也应该是高度内聚的,一个接口中只定义几个一件大事情的几个小事情
- D 依赖倒置: 面向接口编程。(该原则说直白一点就是和具体一些就是当声明方法的参数类型、方法的返回类型时候、变量的引用类型的时候尽量使用抽象类而不是具体类型,因为抽象类型可以被它的任意一个子类型替代)
- 组合加接口 这个应该就是策略模式? 就是相当于声明一个接口类 然后具体实例可以是他的子类这样不仅可以复用代码,而且比继承更好的扩展(优先使用聚合组合方式来复用代码 )
单例
1.关于单例的使用,我记得好像spring注解里的bean啥的就是单例。。全忘了。。还有可以手写三种单例懒汉、恶汉、双重锁
懒汉
public class Singleton{
private static Singleton instance;
private Singleton(){}
public static Singleton getInstance(){
if(instance==null){
intstance=new Singleton();
}
return instance;//下班了 回来写
}
}
享元
2.关于享元 就要扯字符串常量池了,关于字符串常量池,可以扯得很多 常量池 运行常量池 而且这个享元模式在工程中可以用的到的