目录
六大设计原则:
一、单一职责原则
一个类或者模块只负责完成一个职责
二、里氏替换原则
多用组合,少用继承
三、依赖倒置原则
下层模块引入上层模块的依赖,改变原有自上而下的依赖方向(spring ioc)
四、接口隔离原则
建立单一接口,接口尽量细化,接口中的方法尽量少
五、迪米特法则/最少知识原则
一个类对自己需要耦合或调用的类知道的越少越好
六、开闭原则
对扩展开放,对修改关闭
添加一个功能应该是在已有的代码基础上进行扩展,而不是修改已有的代码。
二十二种设计模式:
概述:
创建型模式:单例、原型、工厂方法、抽象工厂、建造者
结构型模式:代理、适配器、桥接、装饰者、门面、享元、组合
行为型模式:命令、迭代器、观察者、策略、模板、职责链、状态、访问者、中介者、备忘录、解释器
创建型模式:
“怎样创建对象”“将对象的创建和使用分离”
一、单例(面试常问)
确保一个类只有一个实例(反射setAccessible(true)可以访问私有构造方法newInstance()创建另外一个对象,反序列化可以破坏单例)
五种实现方式:
饿汉式(线程安全,调用效率高,但不能延时加载)常用
public class SingletonDemo{
private static SingletonDemo instance = new SingletonDemo();
private SingletonDemo(){
}
public static SingletonDemo getInstance() { return instance; }
}
懒汉式(线程安全,调用效率不高,但是能延迟加载)
public class SingletonDemo {
//类初始化时,不初始化这个对象(延迟加载,真正用的时候再创建)
private SingletonDemo instance;
//构造器私有化
private SingletonDemo(){
}
//方法同步调用效率低
public static synchronized SingletonDemo getInstance(){
if(instance == null){
instance = new SingletonDemo();
}
return instance;
}
}
双重校验
public class SingletonDemo {
private volatile static SingletonDemo instance;
private SingletonDemo(){
}
public static SingletonDemo getInstance(){
if(instance == null){
synchronized(SingletonDemo.class){
if(instance == null){
instance = new SingletonDemo();
}
}
}
return instance;
}
}
静态内部类
枚举类
利用枚举类本身就是单例
二、原型
不通过new关键字来产生一个对象,而是通过对象复制(clone或反序列化)来实现。
clone()方法不执行构造函数,直接在内存种拷贝。
clone()为浅拷贝(例如容器类)深拷贝需要重写。
使用场景:
- 类的初始化需要消耗非常多的资源。
- 通过new产生一个对象需要非常繁琐的数据准备或访问。
- 一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值。
三、工厂方法
定义了一个创建对象的接口,但由子类确定要实例化的类是哪一个。工厂方法把实例化推迟到子类。通过抽象方法提供对象生成入口。
四、抽象工厂
提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。通过接口来创建一组产品。
五、建造者
可以封装一个产品的构造过程,并允许按步骤构造产品。将一个复杂的对象分解成多个相对简单的部分,然后根据不同需要分别创建他们,最后构建成该复杂对象。
结构型设计模式:
如何将类或对象按某种布局组成更大的结构。
分为类结构型模式(采用继承机制来组织接口和类)和对象结构型模式(采用组合或聚合来组合对象)
一、代理
为某对象提供一种代理以控制对该对象的访问。
二、适配器
将类的接口转换成客户希望的另一个接口
三、桥接(面试中基本不会问)
将抽象与实现分离,使他们可以独立变化。
优点:将实现解耦,抽象和实现可以独立扩展,不会影响到对方
对于“具体地抽象类”所做的改变,不会影响到客户。
用途:
适合使用在需要跨越多个平台的图形和窗口系统上
适合需要用不同的方式改变接口和实现
缺点:增加了复杂度
四、装饰者(偶尔)
动态地给对象增加一些职责,即增加其额外的功能。动态地将责任附加到对象上。
五、门面
为多个复杂的子系统提供一个一致的接口,使这些子接口更容易被访问
六、享元/蝇量(偶尔)面试几乎遇不到
运用共享对象来有效地支持大量细粒度对象的复用。对象小量大的场景
七、组合(不经常用)
将对象组成树状层次结构
行为型模式(占比最高)
描述程序在运行时复杂的流程控制,类和对象之间怎样相互协作完成单个对象无法单独完成的任务。分为类行为模式(继承)对象行为模式(组合)
一、模板方法(重要)
在一个方法中定义一个算法骨架,将一些实现步骤延迟到子类中。
二、策略(重要)
定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
三、命令(重要)(中间件会用到)
将“请求”封装成命令对象,以便使用不同的请求、队列或日志来参数化其他对象。例子:智能家居遥控器控制不同电器。
四、责任链(不常见)(依赖)
当想要一个以上的对象有机会能够处理某个请求的时候,就使用责任链。使多个对象都有机会处理请求,避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理为止。
五、状态(不常见)--->状态机
允许对象在内部状态改变时改变它的行为。
六、观察者(常见)
定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
七、中介者(常见)
集中相关对象之间复杂的沟通和控制方法。
八、迭代器(会用但不用自己写)
提供一个方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
九、访问者(少)面试会问
作用于某个对象的各个元素的操作。可以在不改变各元素的类的前提下定义作用于这些元素的新操作(在不同visitor操作)。例如:不同人群买苹果电脑。
十、备忘录(少)
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态。当需要让对象返回之前的状态时,就使用备忘录模式。Stack实现。
十一、解释器(少)
提供如何定义语言的文法,以及对语言句子的解释方法。