设计模式

面向对象设计原则

单一职责原则

开闭原则

里氏替换原则(Liskov Substitution Principle)

是对子类型的特别定义。它由芭芭拉·利斯科夫Barbara Liskov) 在1987年在一次会议上名为“数据的抽象与层次”的演说中首先提出。
所有引用基类的地方必须能透明地使用其子类的对象。
简单的说就是,子类可以扩展父类的功能,但不能改变父类原有的功能:
1.子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法
2.子类可以增加自己特有的方法。
3.当子类的方法重载父类的方法时,方法的前置条件(即方法的输入/入参)要比父类方法的输入参数更宽松。
4.当子类的方法实现父类的方法时 (重写/重载或实现抽象方法)方法的后置条件 (即方法的输出/返回值) 要比父类更严格或与父类一样。

依赖倒转原则

依赖倒转原则 (Dependence nversion Principle) 也是我们一直在使用的,最明显的就是我们的Spring框架了。高层模块不应依赖于底层模块,它们都应该依赖抽象。抽象不应依赖于细节,细节应该依赖于油象。还记得我们在我们之前的学习中为什么要一直使用接口来进行功能定义,然后再去实现吗?

接口隔离原则

合成复用原则(组合)

迪米特法则

单例模式

单例模式是一种设计模式,用于确保一个类只有一个实例,并提供一个全局的访问点以获取该实例。它通常用于表示系统中的全局资源或共享资源,例如数据库连接、线程池、配置管理等。

  1. 单例模式具有以下优点:
  • 提供对唯一实例的全局访问点,方便其他对象使用。
  • 避免了多次创建实例的开销,节约了系统资源。
  • 提供了对实例化过程的集中控制,确保实例的一致性和正确性
  1. 单例模式可以通过以下几种方式来实现:
  • 饿汉式(Eager Initialization):在类加载时就创建实例。
  • 懒汉式(Lazy Initialization):在第一次使用时创建实例。
  • 双重检查锁(Double-Checked Locking):在懒汉式基础上添加线程安全的检查机制。
  • 静态内部类(Static Inner Class):利用类加载机制实现延迟加载并保证线程安全。
  • 枚举(Enum):利用枚举类型的特性实现单例模式。

饿汉式

1
2
3
4
5
6
7
8
9
10
11
12
13
//构造方法私有
public class Singleton {
private static final Singleton INSTANCE = new Singleton();

private Singleton() {
// 私有构造方法,防止外部实例化
}

public static Singleton getInstance() {
return INSTANCE;
}
}

静态内部类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Singleton {
private Singleton() {
// 私有构造方法,防止外部实例化
}

private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}

public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}

懒汉式

  • 用的时候在创建,有线程安全问题
  • final必须初始化,不初始化后必须static初始化
  • 解决线程安全问题:如果在方法上加synchronized关键字效率低
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Singleton {
private static Singleton instance;

private Singleton() {
// 私有构造方法,防止外部实例化
}

public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}

双重检查锁机制(Double-Checked Locking)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Singleton {
private static volatile Singleton instance;

private Singleton() {
// 私有构造方法,防止外部实例化
}

public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}

模板方法

当要做一件事儿的时候,这件事儿的步骤是固定好的,但是每一个步骤的具体实现方式是不一定的。

通常,遇到这种情况,我们会把所有要做的事儿抽象到一个抽象类中,并在该类中定义一个模板方法。这就是所谓的模板方法模式。

当我们去银行的营业厅办理业务需要以下步骤:1.取号、2.办业务、3.评价。

三个步骤中取号和评价都是固定的流程,每个人要做的事儿都是一样的。但是办业务这个步骤根据每个人要办的事情不同所以需要有不同的实现。


设计模式
https://bolg.pengfanao.top/2024/08/01/后端/设计模式/
作者
pfa
发布于
2024年8月1日
许可协议