单例模式和静态类

单例模式

这是设计模式中最简单的模式,通过这种模式,可以使一个进程中,只有一个实例。所以这种实例的创建不是 new 出来的。

 

看一个java库中的单例, Runtime提供了私有的构造函数,这样,在外部就没有办法通过构造函数直接创建,然后在内部进行了实例化,通过一个公共的静态方法,将内部实例暴露出来,这样就限制了这个类的实例是全局唯一的,外部只能通过暴露出来的getRuntime方法进行实例化。

全局唯一实例,就使得内存开销减少,也减少了频繁创建的销毁的过程。在数据库或者其他I/O的情景下也减少了内存的开销。

上图中的单例又属于单例中的 饿汉模式,在类加载的时候,就进行了初始化。将上面的代码改造下,

这样类并不是在加载的时候进行实例化,而是在调用的时候才进行了实例化,这种方式是懒汉模式 ,实现了类的懒加载,但是如果多线程同时对这个类进行调用,那就会多次进行实例化,显然就不是单例模式了。

这时候可以对实例化的方法加锁。

但是加锁会对应能有一定的影响,使用双重检查在多线程的情况下回有改善,这种是双重锁

要真正的实现懒加载,还是需要ClassLoad模式,如果没有特殊需求,使用单例模式,使用第一种方式,在加载的时候进行实例化,可以更简单,也少了很多冲突

静态类

这个更比较常见一点,通常用在工具类里面,直接通过  类名.方法名  进行调用。

 

 

静态类和单例模式都是不需要在调用前进行实例化,那他们之间有什么区别呢?

 

单例和静态类的区别

1. 在静态类中不适合维护任何变量,因为他可以被任意的更改。如果仅仅是需要一个对象提供各种静态方法,那很明显静态类更适合。如果需要对某些信息进行维护,那么可以使用单例,外部不能对里面的信息进行随便修改。

2. 静态类的方法不能被重写,而可以对静态类中的方法进行重写。

3. 加载时间不同,静态类在首次加载时被实例化,而单例可以懒加载或者异步加载, 在spring中,也应用了大量的单例模式。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值