设计模式--23种模式精华(一)

来源:互联网 发布:阿里云香港主机测试 编辑:程序博客网 时间:2024/05/21 17:42

单例模式(Singleton)

  • 概念抽象
    • 皇帝模式
    • 只允许一个实例创建
  • 使用条件和场景:
    • 条件
      • 构造方法私有或只有某些类拥有调用的权利
    • 场景
      • 创建时消耗比较多资源的可共享实例
      • 其他实例将某些操作集中交付到这个单例来处理,保障流程,资源等正确的执行或分配
  • 缺点
    • 扩展性差
  • 方法
    • 首先构造方法私有
    • 饿汉模式
      • 定义自己为一个静态的属性对象,直接new一个,确保只创建一个
      • 通过静态方法返回这个属性对象;
      • 缺点
        • 这样的单例如果消耗资源比较多,在还没有使用的情况下,资源已经被消耗了
        • 优点,使用的时候已经准备好了,首次使用不会有延迟的问题
    • 懒汉模式
      • 第一种
        • 定义自己为一个静态的属性对象 加关键字volatile,但不new
        • 调用的时候首先判断属性对象是否为空,不为空则使用synchronized代码块的方式来new一个出来,在synchronized块内需要再次判断是否为空
      • 第二种
        • 使用内部类的方式,定义个一个内部类.内部类里面new一个静态单例对象
        • 外部调用单例类的静态方法时,返回内部类.静态单例
        • 这种方式利用的是类加载机制实现的,调用到这个内部类的时候才去初始化这个内部类的
    • 扩展知识
      • spring的单例是伪单例,是用容器创建了一个对象来使用,确保容器内拿到的永远是一个,但实际上这个还是可以创建的

工厂方法模式(Factory Method)

  • 概念抽象
    • 一个工厂里面有多个生产线生产同系列的多种产品
    • 工厂:入口类
    • 生产线: 类方法
    • 系列:产品基类,产品继承与系列(基类包括抽象类和接口)
    • 产品:具体实现类,工厂输出对象
  • 使用条件和场景:
    • 条件
      • 多个子类具有基类特征
      • 调用者使用基类来操作对象
    • 场景
      • 子类创建过程需要控制
      • 子类创建过程复杂
      • 调用者不关心子类创建细节
  • 方法
    • 一个方法:一个方法通过传类型参数创建所有的产品
      • 不推荐
      • 方法扩展不易
      • 对于调用方不友好
    • 多个方法:
      • 推荐
      • 可再分为静态方法和实例方法
        • 静态方法:用于工厂类不需要额外定义属性或配置,直接某个方法就可以完成产品的创建
        • 实例方法:用于工厂类会创建多个,内有属性或配置项,创建的时候进行初始化,创建产品时会使用到这些属性或配置项

抽象工厂模式(Abstract Factory)

  • 与工厂模式类似
  • 不同点
    • 普通工厂模式:一个工厂多个产品线生产同系列的多种产品
      • 入口唯一
      • 对产品的把控能力强,高内聚
      • 扩展性稍差,新增产品需要更改现有工厂类
    • 抽象工厂模式:多个工厂使用同一种生产方式,各自一个生产线生成同系列的不同产品
      • 入口变多,工厂使用同一标准(基础工厂基类)
      • 扩展性增强,新增产品时可以不调整原来工厂,只需要新增工厂即可
      • 对产品把控能力下降,有点破坏了职责单一原则(高内聚)
  • 使用场景

    • 产品变化太快,经常需要在原来工厂上修改,改成抽象工厂模式后,扩展能力增强,只需新增工厂即可

模板方法模式(Template Method)

  • 概念抽象
    • 生成产品的时候首先定义一个基本的模型作为基础版本,然后在不同的生产线上对基本的模型进行扩展,最终生产出不同的产品
    • 基本模型: 父类,将子类公共的方法抽取到父类中.减少子类的实现成本,增加父类代码的复用性
    • 扩展:子类除了父类的公共特性外会有自己的特性.这部分通过扩展的方式来实现.
  • 使用条件和场景:
    -子类有相同的方法或逻辑
  • 方法
    • 继承

建造者模式(Builder)

  • 抽象概念
    • 工厂生产了很多产品,但这些还都是零件,这些需要组装好了以后才可以给用户使用,建造者模式就是组装零件的一个模式
  • 使用条件和场景
    • 当上层业务要的只是成型的结果,就需要建造者来屏蔽组装细节
  • 方法
    • 给建造者定义配置,传递参数,让建造者根据规则组合出想要的结过,实际是组合的方法

代理模式

  • 抽象概念
    • 当使用某个工具的时候,有些动作每次都需要在这个工具的操作之前和之后操作,这个时候就可以在这个工具外面再加一层封装,这样直接操作的就是这个工具的代理,
  • 使用条件和场景
    • 当对象需要在操作之前和之后进行干预的时候
  • 方法
    • 静态代理
      • 手写代理类
      • aspectj 编译织入
    • 动态代理
      • jdk proxy 反射
    • 字节码代理
      • cglib(动态生成字节码,具有动态和静态的双重特征,底层使用asm)
        扩展知识
        • spring AOP
        • 默认的策略是如果目标类是接口,则使用JDK动态代理技术,否则使用Cglib来生成代理
0 0
原创粉丝点击