Java中的设计模式

设计模式是提高代码可复用性、可维护性、可读性的重要实践,包括创建类、结构型和行为型模式。Java中的设计模式如单例、工厂方法等,遵循开闭原则、里氏代换原则等面向对象设计原则,降低了系统耦合度,增强了软件的灵活性。本文深入探讨了各种设计模式的原理、优缺点及其应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 什么是设计模式
  •  
    • 定义:是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案
    • 本质:本质是面向对象设计原则的实际运用,是对类的封装性、继承性和多态性,以及类的关联关系和组合关系的充分理解
  • 类的设计原则
    • 单一职责原则:
      • 单一职责原则将不同的职责分离到单独的类,每一个职责都是一个变化的中心。
      • 多个职责耦合在一起,影响复用性
    • 里氏代换原则
      • 要求继承是严格的is-a关系
      • 所有引用基类的地方必须能透明地使用其子类的对象
    • 依赖倒置原则
      • 依赖倒置原则的核心就是要我们面向接口编程
      • 变量的声明类型尽量是抽象类或接口。
    • 接口隔离原则
      • 客户端不应该依赖它不需要的接口,需要什么就提供什么,不需要的就不要提供
    • 迪米特法则
      • 迪米特法则(Law of Demeter)又叫作最少知识原则(Least Knowledge Principle 简写LKP)
      • 一个类应该对自己需要耦合或调用的类知道的最少,类与类之间的关系越密切,耦合度越大,那么类的变化对其耦合的类的影响也会越大
      • 面向设计的核心原则:低耦合,高内聚
    • 开闭原则
      • 对修改关闭,对扩展开放
  • 类和类之间的关系
    • 继承关系:父子继承
    • 实现关系:class类指向接口
    • 依赖关系:类B作为参数被类A在某个method方法中使用
    • 关联关系:被关联类B以类的属性形式出现在关联类A中
    • 聚合关系:关联关系的一种特例,它体现的是整体与部分的关系,即has-a的关系
    • 组合关系:也是关联关系的一种特例,它体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合
  • 模式分类
    • 创建类
      • 主要特点是“将对象的创建与使用分离”。这样可以降低系统的耦合度
      • 单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式
      • 原型(Prototype)模式:将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例
      • 工厂方法(FactoryMethod)模式:定义一个用于创建产品的接口,由子类决定生产什么产品
      • 抽象工厂(AbstractFactory)模式:提供一个创建产品族的接口,其每个子类可以生产一系列相关的产品
      • 建造者(Builder)模式:将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成复杂对象
    • 结构型
      • 结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象
      • 1. 代理(Proxy)模式:为某对象提供一种代理以控制对该对象的访问。即客户端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性
      • 2. 适配器(Adapter)模式:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
      • 3. 桥接(Bridge)模式:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现的,从而降低了抽象和实现这两个可变维度的耦合度
      • 4. 装饰(Decorator)模式:动态地给对象增加一些职责,即增加其额外的功能。
      • 5. 外观(Facade)模式:为多个复杂的子系统提供一个一致的接口,使这些子系统更加容易被访问。
      • 6. 享元(Flyweight)模式:运用共享技术来有效地支持大量细粒度对象的复用
      • 7. 组合(Composite)模式:将对象组合成树状层次结构,使用户对单个对象和组合对象具有一致的访问性
    • 行为型模式
      • 行为型模式用于描述程序在运行时复杂的流程控制,它涉及算法与对象间职责的分配合在对象间分配行为。
      • 行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚;对象行为模式比类行为模式具有更大的灵活性
      • 模板方法
      • 策略(Strategy)模式
      • 命令(Command)模式
      • 职责链(Chain of Responsibility)模式
      • 状态(State)模式
      • 观察者(Observer)模式
      • 中介者(Mediator)模式
      • 迭代器(Iterator)模式
      • 访问者(Visitor)模式
      • 备忘录(Memento)模式
      • 解释器(Interpreter)模式
    • 设计模式详解
      • 单例模式
        • 定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式
        • 特点
          • 单例类只有一个实例对象
          • 该单例对象必须由单例类自行创建
          • 单例类对外提供一个访问该单例的全局访问点
        • 优点
          • 单例模式可以保证内存里只有一个实例,减少了内存的开销
          • 可以避免对资源的多重占用
          • 单例模式设置全局访问点,可以优化和共享资源的访问
        • 缺点
          • 单例模式一般没有接口,扩展困难
          • 在并发测试中,单例模式不利于代码调试
          • 单例模式的功能代码通常写在一个类中,如果功能设计不合理,则很容易违背单一职责原则
        • 结构
          • 单例类:包含一个实例且能自行创建这个实例的类。
          • 访问类:使用单例的类
        • 实现
          • 懒汉式单例:在调用功能时才创建对象 ->线程不安全|不同步的
          • 饿汉式单例:在类加载完成之后就创建对象->线程安全的|同步的
      • 简单工厂模式
        • 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中
        • 在简单工厂模式中创建实例的方法通常为静态(static)方法,因此简单工厂模式(Simple FactoryPattern)又叫作静态工厂方法模式(Static Factory Method Pattern)。
        • 优点
          • 工厂类包含必要的逻辑判断,可以决定在什么时候创建哪一个产品的实例
          • 客户端无需知道所创建具体产品的类名,只需知道参数即可。
          • 也可以引入配置文件,在不修改客户端代码的情况下更换和添加新的具体产品类
        • 缺点
          • 1. 简单工厂模式的工厂类单一,负责所有产品的创建,职责过重,一旦异常,整个系统将受影响
          • 2. 使用简单工厂模式会增加系统中类的个数(引入新的工厂类),增加系统的复杂度和理解难度
          • 3. 系统扩展困难,一旦增加新产品不得不修改工厂逻辑,在产品类型较多时,可能造成逻辑过于复杂
          • 4. 简单工厂模式使用了 static 工厂方法,造成工厂角色无法形成基于继承的等级结构
        • 结构
          • 简单工厂(SimpleFactory):是简单工厂模式的核心,负责实现创建所有实例的内部逻辑
          • 抽象产品(Product):是简单工厂创建的所有对象的父类,负责描述所有实例共有的公共接口
          • 具体产品(ConcreteProduct):是简单工厂模式的创建目标
        • 实现
      • 工厂方法模式
        • 优点
          • 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程
          • 灵活性增强,对于新产品的创建,只需多写一个相应的工厂类
          • 典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则
        • 缺点
          • 类的个数容易过多,增加复杂度
          • 增加了系统的抽象性和理解难度
          • 抽象产品只能生产一种产品,此弊端可使用抽象工厂模式解决
        • 结构
          • 抽象工厂(Abstract Factory):提供了创建产品的接口
          • 具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建
          • 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能
          • 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值