Java设计模式——单例设计模式
单例设计模式是设计模式中常谈的一种设计模式
0.简介
百度百科对单例模式是这么说的
单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个实例。即一个类只有一个对象实例。
1.优点
在java语言中,单例带来了两大好处:
1.对于频繁使用的对象,可以省略创建对象所花费的时间。
2.由于new操作的次数减少,因而对系统内存的使用频率也会降低,这将减轻GC压力,缩短GC停顿时间。
2.适用场景
1.用户统计
2.数据库连接池
3.日志系统
4.spring的单利模式…这个应该是单例注册模式…略有区别可以说是单例模式的高级版吧。
…
需要频繁创建对象,销毁对象的场景都可以考虑适用单例模式
3.实现方式
经常被让手撕的设计方式,毕竟代码短,手撕起来方便
3.1懒汉式:比较懒被调用才实例化对象。
public class SingleTon {
private static SingleTon singleTon = new SingleTon();
//不能让new,被new不就多列了吗...
private SingleTon(){}//私有化构造方法
public static SingleTon getInstance(){
if(singleTon == null){//双重验证
//加锁,线程安全
synchronized (SingleTon2.class) {
if(singleTon == null){
new SingleTon2();
}
}
}
return singleTon;
}
}
3.2饿汉式:很饥饿,有我就得弄出来个对象
public class SingleTon{
private static SingleTon singleTon = new SingleTon();//直接实例化对象,不用再创建了。
//不能让new,被new不就多列了吗...
private SingleTon(){}//私有化构造方法
public static SingleTon getIstance(){
return singleTon;
}
}
4.对比
懒汉模式,能够节省空间,不用就不new,但是在多线程情况下需要加锁(如果没有线程安全就别加锁了,提高性能)性能并不高,可以算时间换空间吧…比较经典的就是减少初始化空间而选择懒加载(延迟加载)。
饿汉式,直接new对象,没有线程安全问题,但是不用的时候初始化内存也需要这个内存空间。
这俩方式都有缺点,有什么两全其美的方式吗?
内部类方式…
public class Singleton {
private Singleton() {}
public static class SingletonHolder {//内部类
private static Singleton instance = new Singleton();
}
public static synchronized Singleton getInstance() {
return SingletonHolder.instance;
}
}
用内部类来保护单例,当Singleton类被加载时,内部类不会被初始化,所以可以确保Singleton类被载入JVM时,不会初始化单例类,当getInstance方法被调用时,才会加载SingleHolder,从而初始化instance,同时,由于实例的建立是在类加载时完成的,故天生对多线程友好,getInstance()方法也不需要使用synchronized修饰,因此,这种实现能兼顾前两种写法的优点(延迟加载,非同步)。
上一篇: 删除多余的空白
下一篇: WPF中Border控件属性介绍