设计模式概述及其作用
设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的代码设计经验的总结。使用设计模式的主要目的是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式使代码编制真正工程化,是软件工程的基石。
23种设计模式分类
23种设计模式分为以下三大类:
- 创建型模式:包括单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式等。
- 结构型模式:包括适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式等。
- 行为型模式:包括模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式等。
单例模式及其使用场景
单例模式(Singleton Pattern)是创建型模式的一种,它确保一个类只有一个实例,并提供一个全局访问点。
使用场景:
- Windows的任务管理器,只能打开一个任务管理器。
- Windows系统的回收站。
- 网站的计数器,通过单例模式可以很好地实现。
- 应用程序的日志应用,一般都使用单例模式实现,因为系统一般共用一个日志。
- 数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源,使用单例模式可以大大降低打开或关闭数据库连接所引起的效率损耗。
实现方式:
- 懒汉式(线程不安全):支持延迟加载,但在多线程环境下不能保证单例的唯一性。
- 懒汉式(线程安全):通过在方法前加同步锁
synchronized
关键字的方式,保证在多线程环境下单例的唯一性,但会降低性能。 - 饿汉式:类加载时就初始化实例,避免了多线程同步问题,但可能会浪费一些空间。
- 双重检查锁定:在懒汉式基础上增加了双重检查,既保证了懒加载,又解决了多线程问题。
- 静态内部类:利用类加载机制保证单例的唯一性,既实现懒加载,又保证了线程安全。
保证线程安全:
- 使用
synchronized
关键字。 - 使用双重检查锁定。
- 使用静态内部类。
工厂模式和抽象工厂模式的区别
- 目的不同:工厂模式旨在通过让子类决定应该实例化哪一个类来创建对象,主要用于创建单一类型的对象。而抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
- 复杂性不同:工厂模式相对简单,每个具体工厂类只负责创建一种具体产品。抽象工厂模式更复杂,一个工厂类可以创建多种产品对象。
- 应用场景不同:工厂模式适用于产品种类相对较少且不会频繁增加的情况。抽象工厂模式适用于有多个产品系列,且产品系列中的产品需要一起使用的场景。
简单工厂模式的工作原理
简单工厂模式(Simple Factory Pattern),又叫做静态工厂方法(Static Factory Method)模式,但它不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。其实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。
建造者模式及其使用场景
建造者模式(Builder Pattern)是一种创建型设计模式,它允许你通过分步骤的方式构建一个复杂对象。建造者模式将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。
使用场景:
- 需要生成的对象具有复杂的内部结构。
- 需要生成的对象内部属性本身相互依赖。
- 在对象构建过程中需要使用到构建对象之外的其他服务。
原型模式及其使用场景
原型模式(Prototype Pattern)是一种创建型设计模式,它允许通过复制(或克隆)一个已经存在的对象来创建一个新的对象,而无需重新实例化它。
使用场景:
- 当一个系统应该独立于它的产品创建、构成和表示时。
- 当创建对象的成本很高时(如创建的时间开销很大,或者需要的资源很多)。
- 当一个系统需要复制很多对象,而又不能使用语言中的复制构造函数时。
适配器模式及其使用场景
适配器模式(Adapter Pattern)是一种结构型设计模式,它允许接口不兼容的类一起工作,通过将一个类的接口转换成客户希望的另外一个接口,使原本由于接口不兼容而不能一起工作的那些类可以一起工作。
使用场景:
- 你想要使用一个已经存在的类,但是它的接口与你的需求不匹配。
- 你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不兼容的类)一起工作。
- 你想使用一个已经存在的子类,但是你不能通过继承来复用它的代码,或者你想在运行时动态地指定要使用的类。
桥接模式及其使用场景
桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象部分与实现部分分离,使它们都可以独立地变化。
使用场景:
- 当一个类存在两个或多个独立变化的维度,而这些维度都需要进行扩展时。
- 当你希望避免因一个维度的变化而影响到其他维度时。
- 当你希望实现非常灵活的抽象和实现之间的解耦时。
组合模式及其使用场景
组合模式(Composite Pattern)是一种结构型设计模式,它将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
使用场景:
- 你希望用户以统一的方式处理个别对象和组合对象时。
- 你想表示对象的部分-整体层次结构时。
- 你希望用户忽略组合对象与单个对象的差异时。
装饰器模式及其使用场景
装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许你向一个现有的对象添加新的功能,同时又不改变其结构。
使用场景:
- 当你想要在不修改现有类的前提下,给类动态地增加职责时。
- 当你想要复用现有类时,并且这些类的接口是稳定的(即它们的方法不会改变)。
- 当你想要将职责分配给多个对象,而不是只有一个对象时(这可以消除“过多的使用继承”所带来的问题)。
装饰器、适配器、代理、桥接四种设计模式的区别
- 装饰器模式:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式比生成子类更为灵活。
- 适配器模式:将一个类的接口转换成客户希望的另外一个接口,使原本由于接口不兼容而不能一起工作的那些类可以一起工作。
- 代理模式:为其他对象提供一种代理以控制对这个对象的访问。
- 桥接模式:将抽象部分与实现部分分离,使它们都可以独立地变化。