一、基本概念

面向对象三大特征:

  1. 封装

封装性就是尽可能的隐藏对象内部细节,对外形成一道边界,只保留有限的接口和方法与外界进行交互。

  1. 继承

子类的对象拥有父类的全部属性与方法,称作子类对父类的继承。

  1. 多态

对象的多态性是指在父类中定义的属性或方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为。

二、SOLID设计原则

  • 单一职责原则 (Single Responsibility Principle)

一个类应该只有一个发生变化的原因

  • 开放-关闭原则 (Open-Closed Principle)

对扩展开放对修改关闭,为了使程序的扩展性好,易于维护和升级

  • 里氏替换原则 (Liskov Substitution Principle)

任何基类可以出现的地方,子类一定可以出现,多使用多态的方式

  • 依赖倒置原则 (Dependence Inversion Principle)

尽量多依赖于抽象类或接口而不是具体实现类,对子类具有强制性和规范性

  • 接口隔离原则 (Interface Segregation Principle)

尽量多使用小接口而不是大接口,避免接口的污染,降低类之间耦合度

  • 最少知识原则 (Least Knowledge Principle)

一个实体应当尽量少与其他实体之间发生相互作用,使系统功能模块相对独立

  • 合成复用原则 (Composite Reuse Principle)

尽量多使用合成/聚合的方式,而不是继承的方式
image.png
说明:

  • 单一职责 是所有设计原则的基础,开闭原则 是设计的终极目标。
  • 里氏替换原则 强调的是子类替换父类后程序运行时的正确性,它用来帮助实现 开闭原则
  • 接口隔离原 则用来帮助实现 里氏替换原则,同时它也体现了 单一职责
  • 依赖倒置原则 是过程式编程与面向对象编程的分水岭,同时它也被用来指导 接口隔离原则
  • 单独应用SOLID的某一个原则并不能让收益最大化。应该把它作为一个整体来理解和应用,从而更好地指导你的软件设计。

依赖倒置原则告诉我们要面向接口编程。当我们面向接口编程之后,接口隔离原则和单一职责原则又告诉我们要注意职责的划分,不要什么东西都塞在一起。当我们职责捋得差不多的时候,里氏替换原则告诉我们在使用继承的时候,要注意遵守父类的约定。而上面说的这四个原则,它们的最终目标都是为了实现开闭原则。

三、单例模式

懒汉单例模式双重检查加锁

  1. public class Singleton3 {
  2. // volatile可以禁止jvm的指令重排问题
  3. private volatile static Singleton3 uniqueInstance = null;
  4. private Singleton3(){
  5. }
  6. public static Singleton3 getInstance(){
  7. // 判断对象是否实例化,未实例化进行获取同步锁操作
  8. if (uniqueInstance == null){
  9. // 获取同步锁(多线程下会有多个请求进来)
  10. synchronized (Singleton3.class){
  11. // 在多线程下,线程1进行初始化实例后,释放锁,
  12. // 而阻塞的线程2获取锁,进行初始化实例
  13. // 这样会产生同一个对象创建多个实例化的问题
  14. if (uniqueInstance == null){
  15. // 保证同一个实例只一个实例
  16. uniqueInstance = new Singleton3();
  17. }
  18. }
  19. }
  20. return uniqueInstance;
  21. }

设计模式中懒汉单例模式双重检查枷锁的类需要添加volatile关键字进行修饰( volatile 可以禁止 JVM 的指令重排)