一文带你了解常见的设计原则和设计模式

414 阅读5分钟

这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战

1、常见的设计原则

1.1、软件开发的流程

  • 需求分析文档
  • 概要设计文档
  • 详细设计文档
  • 编码和测试
  • 安装和调试
  • 维护和升级

1.2、常用的设计原则

  • 开闭原则(Open Close Principle)

    对扩展开放对修改关闭,为了使程序的扩展性好,易于维护和升级。
    
  • 里氏代换原则(Liskov Substitution Principle)

     任何基类可以出现的地方,子类一定可以出现,多使用多态的方式。
    
  • 依赖倒转原则(Dependence Inversion Principle)

     尽量多依赖于抽象类或接口而不是具体实现类,对子类具有强制性和规范性
    
  • 接口隔离原则(Interface Segregation Principle)

    尽量多使用小接口而不是大接口,避免接口的污染,降低类之间耦合度。
    
  • 迪米特法则(最少知道原则)(Demeter Principle)

    一个实体应当尽量少与其他实体之间发生相互作用,使系统功能模块相对独立。高内聚,低耦合。
    
  • 合成复用原则(Composite Reuse Principle)

    尽量多使用合成/聚合的方式,而不是继承的方式。
    
    

2、常用的设计模式

2.1、基础概念

  • 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。

  • 设计模式就是一种用于固定场合的固定套路。

2.2、基础分类

  • 创建型模式
  • 结构型模式
  • 行为型模式

2.3、常用的设计模式详解

2.3.1、单例设计模式

单例设计模式主要分为:饿汉式 和 懒汉式,懒汉式需要对多线程进行同步处理。

2.3.2、普通工厂模式

  • 基础概念

普通工厂方法模式就是建立一个工厂类,对实现了同一接口的不同实现类进行实例的创建。

  • 类图结构

image.png

  • 缺点:违背了开放原则,扩展不易,每次都要写ifelse来进行扩展

2.3.2、工厂方法模式

  • 基础概念

工厂方法是简单工厂的进一步深化,在工厂方法模式中,针对不同的对象提供不同的工厂。也就是说 每个对象都有一个与之对应的工厂

  • 类图结构

image.png

  • 缺点

    • 在多个工厂方法模式中,为了能够正确创建对象,先需要创建工厂类的对象才能调用工厂类中的生产方法。
    • 工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序生产新的产品,就必须对工厂类的代码进行修改,这就违背了开闭原则。

2.3.3、抽象工厂模式

  • 基础概念

抽象工厂模式是工厂方法的进一步深化,在这个模式中的工厂类不单单可以创建一种产品,而是可以创建一组产品。

  • 类图结构

image.png

  • 优点

    • 1、解耦 :把对象的创建和使用的过程分开
    • 2、降低代码重复: 如果创建某个对象的过程都很复杂,需要一定的代码量,而且很多地方都要用到,那么就会有很多的重复代码。
    • 3、降低维护成本 :由于创建过程都由工厂统一管理,所以发生业务逻辑变化,不需要找到所有需要创建某个对象的地方去逐个修正,只需要在工厂里修改即可,降低维护成本。

2.3.4、装饰器模式

  • 基本概念

装饰器模式就是给一个对象动态的增加一些新功能,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例。

  • 类图结构

image.png

  • 优点和缺点

    • 优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能
    • 缺点:多层装饰比较复杂。
  • 实际意义

    • 可以实现一个类功能的扩展。
    • 可以动态的增加功能,而且还能动态撤销(继承不行)。

2.3.5、代理模式

  • 基础概念

    • 代理模式就是找一个代理类替原对象进行一些操作。

    • 代理模式主要分为静态代理、动态代理、cglib代理

    • 比如我们在租房子的时候找中介,再如我们打官司需要请律师,中介和律师在这里就是我们的代理。

  • 类图结构

image.png

  • 优点和缺点

    • 优点

        1、职责清晰。
        2、高扩展性。
        3、智能化。
      
    • 缺点

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

    • 装饰器模式通常的做法是将原始对象作为一个参数传给装饰者的构造器,而代理模式通常在一个代理类中创建一个被代理类的对象。

    • 装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。