设计模式(一)——创建型模式

创建型模式:单例模式、工厂模式、建造者模式、原型模式

单例模式

  • 核心作用 :保证一个类只有一个实例,并且提供一个访问该实例的全局访问点

在这里插入图片描述

单例模式的优点

  • 由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要
    比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动
    时直接产生一个单例对象,然后永久驻留内存的方式来解决
  • 单例模式可以在系统设置全局的访问点,优化环共享资源访问,例如可以设计
    一个单例类,负责所有数据表的映射处理

常见的五种单例模式实现方式

  • 主要:
    • 饿汉式:线程安全,调用效率高。但是,不能延时加载。
    • 懒汉式:线程安全,调用效率不高。但是,可以延时加载。
  • 其它:
    • 双重检测锁式(由于JVM底层内部模型原因,偶尔会出问题。不建议使用)
    • 静态内部类式(线程安全,调用效率高。 但是,可以延时加载)
    • 枚举单例(线程安全,调用效率高,不能延时加载)

如何选用?

  • 单例对象占用资源少,不需要延时加载:枚举式好于饿汉式
  • 单例对象占用资源多,需要延时加载:静态内部类式好于懒汉式

问题:

  • 反射可以破解上面几种(不含枚举式)实现方式(可以在构造方法中手动抛出异常控制)
  • 反序列化可以破解上面几种((不包含枚举式))实现方式! 可以通过定义readResolve()防止获得不同 对象

实现

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

工厂模式

  • 实现了创建者和调用者的分离
  • 分类
    • 简单工厂模式:用来生产同一等级结构中的任意产品。(对于增加新的产品,需要修改已有的代码)
    • 工厂方法模式:用来生产同一等级结构中的固定产品。(支持增加任意产品)
    • 抽象工厂模式:用来生成不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)
  • 核心本质
    • 实例化对象,用工厂方法代替new操作
    • 将选择实现类、创建对象统一管理和操作。从而将调用者跟我们的实现类解耦。
简单工厂模式

要点

  • 简单工厂模式也叫静态工厂模式,就是工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例。
  • 对于增加新产品无能为力!不修改代码的话,是无法扩展的。

在这里插入图片描述

工厂方法模式

要点

  • 为了避免简单工厂模式的缺点(不完全满足OCP)
  • 工厂方法模式和简单工厂模式最大的不同在于,简单工厂模式只有一个(对于一个项目或者一个独立模块而言)工厂类,而工厂方法模式 有一组实现了相同接口的工厂类。
    在这里插入图片描述
    在这里插入图片描述
抽象工厂模式
  • 用来生产不同产品族的全部产品。(对于增加新的产品无能为力,支持增加产品族)
  • 抽象工厂模式是工厂方法模式的升级版本,在有多个业务品质、业务分类时,通过抽象工厂模式产生需要的对象是比较好的解决方法。
    在这里插入图片描述

工厂模式要点

  • 简单工厂模式(静态工厂模式)
    • 虽然某种程度上不符合设计原则,但实际使用最多
  • 工厂方法模式
    • 不修改已有类的前提下,通过增加新的工厂类实现扩展
  • 抽象工厂模式
    • 不可以增加产品,可以增加产品族

建造者模式

场景

  • 我们要建造一个复杂的产品。比如:神州飞船,Iphone。这个复杂的产品的创建。有这样一个问题需要处理:装配这些子组件是不是有个步骤问题?
  • 实际开发中,我们所需要的对象构建时,也非常复杂,有很多步骤需要处理时

建造模式的本质

  • 分离了对象子组件的单独构造(由Builder来负责)和装配(由Director负责)。从而可以构造出负责的对象。某个对象的构建过程复杂的情况下使用。
  • 由于实现了构建和装配的解耦,不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法、装配算法的解耦,实现了更好的复用。
    在这里插入图片描述

原型模式prototype

原型模式

  • 通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式
  • 就是java中的克隆技术,以某个对象为原型,复制出新的对象。显然,新的对象具备原型对象的特点
  • 优势有:效率高(直接克隆,避免了重新执行构造过程步骤) 。
  • 克隆类似于new,但是不同于new。new创建新的对象属性采用的是默认值。克隆出的对象的属性值完全和原型对象相同。并且克隆出的新对象改变不会影响原型对象。然后,再修改克隆对象的值。

原型模式的实现

  • Cloneable接口和clone方法
  • Prototype模式中实现起来最困难的地方就是内存复制操作,所幸在Java中提供了clone()方法替我们做了绝大部分事情

浅克隆存在的问题

  • 被复制的对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。

深克隆如何实现

  • 深克隆把引用的变量指向复制过的新对象,而不是原有的被引用的对象。
  • 深克隆:让已实现Clonable接口的类中的属性也实现Clonable接口
  • 基本数据类型和String能够自动实现深度克隆(值的复制)
    在这里插入图片描述
  • 利用序列化和反序列化技术实现深克隆
    在这里插入图片描述

开发中的应用场景

  • 原型模式很少单独出现,一般是和工厂方法模式一起出现,通过clone的方法创建一个对象,然后由工厂方法提供给调用者。
  • spring中bean的创建实际就是两种:单例模式和原型模式。(当然,原型模式需要和工厂模式搭配起来)

创建型模式总结

创建型模式:都是用来帮助我们创建对象的!

  • 单例模式
    • 保证一个类只有一个实例,并且提供一个访问该实例的全局访问点
  • 工厂模式
    • 简单工厂模式
      • 用来生产同一等级结构中的任意产品。(对于增加新的产品,需要修改已有代码)
    • 工厂方法模式
      • 用来生产同一等级结构中的固定产品。(支持增加任意产品)
    • 抽象工厂模式
      • 用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)
  • 建造者模式
    • 分离了对象子组件的单独构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象。
  • 原型模式
    • 通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值