初识设计模式

目录

    • 设计模式的好处
    • 六大原则
    • 23个类别
    • 重要模式详述
      • 工厂模式
      • 单例模式
      • 建造者模式
      • 适配器模式
      • 装饰器模式
      • 代理模式
      • 策略模式

设计模式的好处

  1. 重用代码
  2. 让代码更容易被他人理解
  3. 保证代码可靠性

六大原则

SOLID(稳定的):首字母排序,34重复只取一个

  1. 单一职责原则(Single Responsibility Principle)

    一个接口或者类只能有一个职责,它就负责一件事情

  2. 开闭原则(Open Close Principle)

​ 对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码。想要达到这样的效果,需要使用接口和抽象类。

  1. 里氏代换原则(Liskov Substitution Principle)

​ 任何基类可以出现的地方,子类一定可以出现。只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用。

  1. 迪米特法则,又称最少知道原则(Law of Demeter)

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

  2. 接口隔离原则(Interface Segregation Principle)

    使用多个隔离的接口,比使用单个接口要好,从而降低类之间的耦合度。

  3. 依赖倒转原则(Dependence Inversion Principle)

​ 针对接口编程,依赖于抽象而不依赖于具体。

23个类别

  1. 创建型(5个):这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。
    • 单例模式
    • 工厂模式
    • 抽象工厂模式
    • 建造者模式
    • 原型模式
  2. 结构型(7个):这些设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。
    • 适配器模式
    • 装饰器模式
    • 代理模式
    • 外观模式
    • 桥接模式
    • 组合模式
    • 享元模式
  3. 行为型(11个):这些设计模式特别关注对象之间的通信。
    • 策略模式
    • 模板方法模式
    • 观察者模式
    • 迭代器模式
    • 责任链模式
    • 命令模式
    • 备忘录模式
    • 状态模式
    • 访问者模式
    • 中介者模式
    • 解释器模式

重要模式详述

工作中,掌握它们就够了

工厂模式

  1. 概述:我们在创建对象时不会对客户端暴露创建逻辑,定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类。主要解决接口选择的问题。
  2. 优点:
    • 一个调用者想创建一个对象,只要知道其名称就可以了
    • 扩展性高,如果想增加一个产品(已有抽象产品),只要增加具体产品,修改工厂类就可以
    • 屏蔽产品的具体实现,调用者只关心产品的接口
  3. 缺点:
    • 每次增加一个产品时(没有抽象产品),都需要增加一个接口,具体产品类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖
  4. 跑代码的一些想法:
    • 一个接口,一个工厂,不同类型实现接口,工厂返回不同类型的对象
    • 可以应用在一个电脑工厂,处理器作为接口
    • ShapeFactory是工厂角色,Shape是抽象产品角色,三种形状是具体产品角色

单例模式

  1. 概述:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。主要解决一个全局使用的类频繁地创建与销毁,节约系统资源。

  2. 优点:

    • 在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例。如:学校官网只有一个页面,只需一个对象
    • 避免对资源的多重占用,如:写文件操作
  3. 缺点:

    • 没有接口,不能继承
    • 与单一职责原则冲突,因为这个类要实现管理自己的生命周期,包括初始化和回收等。
  4. 跑代码的一些想法:

    • 先自己创建对象,提供一个获取该唯一对象的方法
    • 用private修饰构造函数,这样就不能被实例化
    • 懒汉和饿汉,懒汉-只有别人向它要对象才实例化,饿汉-类初始化时就实例化

建造者模式

  1. 概述:使用多个简单的对象一步一步构建成一个复杂的对象。分而治之,便于维护。

  2. 优点:

    • 建造者独立,易扩展
    • 便于控制细节风险
  3. 缺点:

    • 产品必须有共同点,范围有限制
    • 如内部变化复杂,会有很多的建造类
  4. 跑代码的一些想法:

    • 每个实体都定义成一个类,类的数量是指数级增长,太多了

适配器模式

  1. 概述:将一个类的接口转换成客户希望的另一个接口,使得原本因为版本不兼容而不能一起工作的类可以一起工作。

  2. 优点:

    • 可以让任何两个没有关联的类一起运行
    • 提高了类的复用
    • 增加了类的透明度
    • 灵活性好
  3. 缺点:

    • 过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构
    • 由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类

装饰器模式

  1. 概述:允许向一个现有的对象添加新的功能,同时又不改变其结构。

  2. 优点:

    • 装饰类和被装饰类可以独立发展,不会相互耦合,可以动态扩展一个实现类的功能
  3. 缺点:

    • 多层装饰比较复杂

代理模式

  1. 概述:为其他对象提供一种代理以控制对这个对象的访问。

  2. 优点:

    • 职责清晰
    • 高扩展性
    • 智能化
  3. 缺点:

    • 由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢
    • 实现代理模式需要额外的工作,有些代理模式的实现非常复杂

策略模式

  1. 概述:一个类的行为或其算法可以在运行时更改。

  2. 优点:

    • 算法可以自由切换
    • 避免使用多重条件判断
    • 扩展性良好
  3. 缺点:

    • 策略类会增多
    • 所有策略类都需要对外暴露

你可能感兴趣的:(专业书籍,#,后端,设计模式,java,开发语言)