“你就是我的唯一,两个世界都变形,回去谈和容易。确定 你就是我的唯一,独自对着电话说我爱你,我真的爱你...”
单例模式,就是确保唯一,确保某一个类只有一个实例,而且自行实例化,并提供给整个系统。
单例模式有两种常用的实现方式,下面来看一下这两种实现方式的代码:
<pre name="code" class="java">public class Singleton{
private static final Singleton singleton = new Singleton();
//限制产生多个对象
private Singleton(){}
//获取实例对象
public static Singleton getSingleton(){
return singleton;
}
public void doSomething(){//处理代码}
}
第一种实现代码如上,这种方式一般被称为饿汉式单例,推荐使用这种方式实现单例;
<pre name="code" class="java"><pre name="code" class="java">public class Singleton{
private static Singleton singleton = null;
//限制产生多个对象
private Singleton(){}
//获取实例对象
public static Singleton getSingleton(){
if(singleton == null){
singleton = new singleton();
}
return singleton;
}
public void doSomething(){//处理代码}
}
第二种实现代码如上,这种方式在低并发的情况下不会有什么问题,但是在系统压力增大,并发量增大时内存中可能会出现多个对象实例,破坏了单例的初衷。为了解决
这个问题,我们可以在getSingleton函数上添加synchronized关键字来解决,但都不是最优秀的单例(增加了synchronized的上述单例模式被称为懒汉式单例)。
下面我们来看一下单例模式有哪些优缺点:
优点:由于内存中只产生一个对象,减少内存开支,减少性能开销,避免了对资源的多重占用等;
缺点:单例没有接口,所以扩展很困难;对测试不利,单例没有完成,不能进行测试;与单一职责原则有冲突。
单例模式的适用场景:
单例模式是23个模式中最简单的模式,应用非常广泛,其中最熟知的应该是spring框架中的每个bean默认都是单例的,这样做的优点是Spring容器可以控制这些对象的生命周期。使用单例模式需要注意的是JVM的垃圾回收机制,一旦对象被回收,下次调用将重新创建一个对象,将恢复到最初的状态,对于采用单例来记录有状态值的情况,将会出现故障,遇到这个问题,我们可以在程序中做好随时保存状态值的准备。
好了,这是我的第一篇博客,也是我学习的成果,参照了《设计模式之禅》这本书。