单例模式代码_MyBatis代码整洁之道模式设计模式细说单例模式

单例模式

单例模式这里就不用情景模式讲解了,在平时开发中此模式还是用的比较多的。在WinForm开发的时候,一般设置程序都是使用的单例开发。

定义:

单例模式属于创建型模式,它用于保证一个类仅有一个实例,并提供一个访问它的全局访问点。

要点:

  • 某个类只有有一个实例
  • 它必须自己创建这个实例
  • 他必须自行向整个系统提供这个实例

和工具类的区别:

在刚开始接触单例的时候,一直不明白为什么不直接都用static属性,这样明明也是单独的一份。
其实单例相对于工具类(utils)最大的区别在于单例是一个对象,而工具类都是静态方法。
单例相对于工具类的优势在于:

  • 更加便于编写第一次初始化的代码,虽然工具类使用static块也可以,但是没有单例容易管理
  • 单例可以使用懒汉式延迟初始化,在一些初始化代价比较高的地方比较实用,而工具类不行
  • 单例作为一个对象,可以很方便的继承和实现接口,而工具类不行

就比如在winform的设置程序中,我们写的设置程序都是继承于Form窗体的,而此时就只能使用单例,而且Form窗体更像是一个对象,因此使用单例也更加合适。

Java 单例的几种写法

饿汉式

a3c5908f42fe3a14724559c34b97bb02.png

懒汉式

b99d996850a9c2de25a869909e94a848.png

枚举

2dc2c95ea5363ca901731d0c7ea56ee7.png

内部类

ce4bd47e2fef68419cd493ed950b0a76.png

下面详细

解释下

上面的方式:

  • 饿汉式:饿汉式是指直接在声明类的时候就初始化,这种是比较方便的内部类方式,缺点就在于只要这个类被加载了(比如引用这个类的某个静态属性等),构造方法就会被调用,如果构造方法比较大,可能会引起不必要的性能消耗,第二点就在于,上面的单例是可以被攻击的,可以通过反射直接newInstance一个新的对象,也可以通过序列化和反序列化生成新的对象,防守办法虽然有,但是比较麻烦
  • 懒汉式:懒汉式是指真正需要使用这个对象的时候,才初始化这个对象,没有了饿汉式的缺点,但是编写比较复杂,和简单的饿汉式一样,也容易被攻击
  • 枚举:枚举是JDK1.5中自带的一种语法,这种语法是天生完美支持内部类的,因为枚举就是一种特殊的类,但是值得注意的是枚举和饿汉式的形式一样,只要属性被引用,就会初始化对象,
    枚举是默认有防守反射和序列化和反序列化的,因此使用枚举实现单例类,是一个非常不错的选择
  • 内部类:说实话,第一次看见这种方式实现内部类的时候,比较震惊。能想出这种方式的人,一定是能灵活把握JAVA语法的人。这里内部类利用的主要的一点就是内部类能够访问外部类的私有方法,因此在加载外部类的时候,由于没有使用内部类的任何属性,内部类不会被加载,而在需要使用内部类的时候,才会加载内部类的属性,从而实现了懒汉式的单例类,但是内部类的方式,同样存在序列化和反射攻击,因此可以根据情况进行选择。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值