设计模式是软件工程中共同的问题的解决方案,这些方案经过了验证和总结,能够在不同的情境中提供最佳的解决途径。设计模式主要分为三类:创建型模式、结构型模式和行为型模式。以下是这三类模式中的 23 个经典设计模式的列表:
创建型模式(Creational Patterns):
创建型模式涉及对象的初始化和创建过程,它可以使得系统在不需要指定精确类的情况下创建对象。
- 单例(Singleton)
- 原型(Prototype)
- 工厂方法(Factory Method)
- 抽象工厂(Abstract Factory)
- 建造者(Builder)
结构型模式(Structural Patterns):
结构型模式关注如何组合类和对象以获得更大的结构。
- 装饰器(Decorator)
- 适配器(Adapter)
- 桥接(Bridge)
- 组合(Composite)
- 外观(Facade)
- 享元(Flyweight)
- 代理(Proxy)
行为型模式(Behavioral Patterns):
行为型模式关注对象之间的职责分配。它们描述了对象之间的通信及其之间关系。
- 责任链(Chain of Responsibility)
- 命令(Command)
- 解释器(Interpreter)
- 迭代器(Iterator)
- 中介者(Mediator)
- 备忘录(Memento)
- 观察者(Observer)
- 状态(State)
- 策略(Strategy)
- 模板方法(Template Method)
- 访问者(Visitor)
这些模式是编程经验的晶体,能够帮助程序员避免重复 "重新发明轮子",而是利用已有的设计模式来解决常见问题。了解和掌握这些设计模式可以使设计更加清晰、代码更容易维护和扩展。
单例模式
单例模式分为懒汉模式和饿汉模式;
饿汉:该模式在类被加载时就会实例化一个对象。
该模式能简单快速的创建一个单例对象,而且是线程安全的(只在类加载时才会初始化,以后都不会)。但是它有一个缺点,就是不管你要不要都会直接创建一个对象,会消耗一定的性能(性能几乎可以忽略不计,所有这种模式在很多场合十分常用而且十分简单)。
懒汉:该模式只在你需要对象时才会生成单例模式(比如调用getInstance方法)
单例模式∶使用静态函数,获得对象
- 单例类只能有一个实例。
- 单例类必须自己创建自己的唯一实例。
- 单例类必须给所有其他对象提供这一实例。
单例模式的实现
- 懒汉式∶ 线程不安全,需要双重加锁(重要) 不使用的时候不占用内存,不是线程安全的 在类加载时不初始化,等待第一次被调用才初始化
- 饿汉式∶
线程安全
内部唯一的对象是在程序刚运行时进行初始化的。
可以保证线程安全,缺点是即使不使用也会进行初始化,浪费资源
懒汉模式:懒汉模式指的是单例实例在需要时才被创建。这种模式的关键在于延迟加载,即直到第一次调用 getInstance()
方法时才创建实例。在多线程环境下需要特别小心对实例化过程中的并发访问进行处理,通常需要同步处理。
public class LazySingleton {
private static LazySingleton instance;
private LazySingleton() {} // 私有构造函数
public static synchronized LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton(); // 实例在这里创建
}
return instance;
}
}
饿汉模式:相对于懒汉模式,饿汉模式在类加载时就立即创建该类的单例实例。由于类加载在程序开始时就完成了,因此不需要担心多线程问题。这是一个简单且线程安全的实现方式。
public class EagerSingleton {
// 直接初始化一个实例
private static final EagerSingleton instance = new EagerSingleton();
private EagerSingleton() {} // 私有构造函数
public static EagerSingleton getInstance() {
return instance; // 直接返回实例
}
}