准备系统的看一下设计模式了,在此记录总结一下我理解的单例模式
1.使用场景
a.页面的计数器:因为在每访问一次记录+1.如果初始化很多计数器实例的话,导致计数器不准确。所以我们要保证就初始化一个实例,这样就用到了单例模式
b.spring bean也有使用单例,通过配置可以是实现单例
<bean id="***" class="******" init-method="init" scope="singleton">用单例实现
<bean id="***" class="***" init-method="init" scope="prototype">不用,每调用一次就重新实例化一个对象
c.windows的任务管理器,无论你打开多少次任务管理器,我们看到的只有一个窗口
2.单例模式分类
单例模式分为:饿汉式和懒汉式
饿汉式故名思意很需要食物,上来就直接实例化一个对象,不管你使用不使用
懒汉式就是我很懒,事情不拖到最后绝不干活,所以懒汉式是当你调用时才会去实例,不调用就在那喝喝茶聊聊天。
2.1 接下来实现一下单例
饿汉式:
public SingletonDemo{
public static SingletonDemo instance=new SingletonDemo();
private SingletonDemo(){
}
public SingletonDemo getSingletonDemo(){
return instance;
}
}
懒汉式
public SingletonDemo{
public static SingletonDemo instance=null;
private SingletonDemo(){
}
public synchronized SingletonDemo getSingletonDemo(){
if(instance==null){
instance=new SingletonDemo();
}
return instance;
}
饿汉式和懒汉式在都保证线程安全的情况下饿汉式相对比懒汉式效率高,因为懒汉式有锁,有等待时间。饿汉式因为无论你在用不用的情况下都会实例化,会有一定空间上的浪费。我们想要一种既可以不加锁,又可以在使用的时候再实例的实现方法,静态内部类帮我们解决(静态类是天然的线程安全)。上代码
public SingletonDemo{
public static SingletonDemoInstance{
public static SingletonDemo instance=new SingletonDemo ();
}
private SingletonDemo(){
}
public SingletonDemo getSingletonDemo(){
return SingletonDemoInstance.instance;
}
单例也可以使用枚举来实现,在这我就不附代码了。