一、基本概念
面向对象三大特征:
- 封装
封装性就是尽可能的隐藏对象内部细节,对外形成一道边界,只保留有限的接口和方法与外界进行交互。
- 继承
子类的对象拥有父类的全部属性与方法,称作子类对父类的继承。
- 多态
对象的多态性是指在父类中定义的属性或方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为。
二、SOLID设计原则
- 单一职责原则 (Single Responsibility Principle)
一个类应该只有一个发生变化的原因
- 开放-关闭原则 (Open-Closed Principle)
对扩展开放对修改关闭,为了使程序的扩展性好,易于维护和升级
- 里氏替换原则 (Liskov Substitution Principle)
任何基类可以出现的地方,子类一定可以出现,多使用多态的方式
- 依赖倒置原则 (Dependence Inversion Principle)
尽量多依赖于抽象类或接口而不是具体实现类,对子类具有强制性和规范性
- 接口隔离原则 (Interface Segregation Principle)
尽量多使用小接口而不是大接口,避免接口的污染,降低类之间耦合度
- 最少知识原则 (Least Knowledge Principle)
一个实体应当尽量少与其他实体之间发生相互作用,使系统功能模块相对独立
- 合成复用原则 (Composite Reuse Principle)
尽量多使用合成/聚合的方式,而不是继承的方式
说明:
- 单一职责 是所有设计原则的基础,开闭原则 是设计的终极目标。
- 里氏替换原则 强调的是子类替换父类后程序运行时的正确性,它用来帮助实现 开闭原则。
- 而 接口隔离原 则用来帮助实现 里氏替换原则,同时它也体现了 单一职责。
- 依赖倒置原则 是过程式编程与面向对象编程的分水岭,同时它也被用来指导 接口隔离原则。
- 单独应用SOLID的某一个原则并不能让收益最大化。应该把它作为一个整体来理解和应用,从而更好地指导你的软件设计。
依赖倒置原则告诉我们要面向接口编程。当我们面向接口编程之后,接口隔离原则和单一职责原则又告诉我们要注意职责的划分,不要什么东西都塞在一起。当我们职责捋得差不多的时候,里氏替换原则告诉我们在使用继承的时候,要注意遵守父类的约定。而上面说的这四个原则,它们的最终目标都是为了实现开闭原则。
三、单例模式
懒汉单例模式双重检查加锁
public class Singleton3 {
// volatile可以禁止jvm的指令重排问题
private volatile static Singleton3 uniqueInstance = null;
private Singleton3(){
}
public static Singleton3 getInstance(){
// 判断对象是否实例化,未实例化进行获取同步锁操作
if (uniqueInstance == null){
// 获取同步锁(多线程下会有多个请求进来)
synchronized (Singleton3.class){
// 在多线程下,线程1进行初始化实例后,释放锁,
// 而阻塞的线程2获取锁,进行初始化实例
// 这样会产生同一个对象创建多个实例化的问题
if (uniqueInstance == null){
// 保证同一个实例只一个实例
uniqueInstance = new Singleton3();
}
}
}
return uniqueInstance;
}
设计模式中懒汉单例模式双重检查枷锁的类需要添加volatile关键字进行修饰( volatile 可以禁止 JVM 的指令重排)