设计模式--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来生成代理
- cglib(动态生成字节码,具有动态和静态的双重特征,底层使用asm)
- 静态代理
0 0
- 设计模式--23种模式精华(一)
- 设计模式--23种模式精华(二)
- 设计模式--23种模式精华(三)
- 设计模式--23种模式精华(四)
- 设计模式--23种模式精华(五)
- 设计模式--23种模式精华(六)
- 设计模式--23种模式精华(七)
- 设计模式 精华一页纸
- 23种设计模式(一)
- 设计模式学习笔记--23种设计模式(一)
- 设计模式(博客园精华集)
- java设计模式面试全攻略【精华】
- 23种设计模式一:创建型单例模式
- 23种设计模式 (一) 创建型模式
- 23种设计模式之原型模式(一)
- JAVA的23种设计模式一-------工厂方法模式
- JAVA的23种设计模式---代理模式(一)
- JAVA的23种设计模式---备忘录模式(一)
- Spark+IntelliJ IDEA创建项目
- 删除小电池图标及百分比
- kill 掉所有正在运行的hadoop jobs
- JForum框架结构和主要配置文件说明
- java 设计模式---创建对象
- 设计模式--23种模式精华(一)
- NLTK安装tips
- block的实现原理(二)
- 关于maven(持续更新)
- [Javascript]异步上传文件
- 我的科研生活2017-3-23
- 我的WCF之旅(4):WCF中的序列化[下篇]
- 常见Android面试题及答案(详细整理)
- PHP字符串处理