模式介绍
单例模式(Singleton Pattern)属于创建型模式,在整个软件运行系统中,对于某个类,只能存在一个对象实例。
模式优点
1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例。
模式缺点
1、没有接口,不能继承,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
使用场景
1、创建时耗时多、耗费资源多但又经常用到的对象,例如工具类对象、频繁访问数据库、文件读写的对象等。
系统建模
1、下面介绍几种单例模式,大体分为饿汉式和懒汉式两种。
系统实现
饿汉式(一)
/**
* 饿汉式(一)
* 优点:线程安全。
* 缺点:没有起到Lazy Loading效果。
* 总结:这种单例模式可用,但是可能造成内存浪费。
*/
class SingleTon {
private SingleTon(){};
private final static SingleTon singleTon = new SingleTon();
public static SingleTon getInstance(){
return singleTon;
}
}
饿汉式(二)
/**
* 饿汉式(二)
* 优点:线程安全。
* 缺点:没有起到Lazy Loading效果。
* 总结:这种单例模式可用,但是可能造成内存浪费。
*/
class SingleTon {
private SingleTon(){};
private final static SingleTon singleTon ;
static{
singleTon = new SingleTon();
}
public static SingleTon getInstance(){
return singleTon;
}
}
懒汉式(一)
/**
* 懒汉式(一)
* 优点:起到Lazy Loading效果。
* 缺点:线程不安全。
* 总结:实际开发中不可使用。
*/
class SingleTon {
private SingleTon(){};
private static SingleTon singleTon ;
public static SingleTon getInstance(){
if(singleTon == null){
singleTon = new SingleTon();
}
return singleTon;
}
}
懒汉式(二)
/**
* 懒汉式(二)
* 优点:起到Lazy Loading效果,线程安全。
* 缺点:每次获取对象都要上锁,效率太低了。
* 总结:实际开发中不可使用。
*/
class SingleTon {
private SingleTon(){};
private static SingleTon singleTon ;
public static synchronized SingleTon getInstance(){
if(singleTon == null){
singleTon = new SingleTon();
}
return singleTon;
}
}
懒汉式(三)
/**
* 懒汉式(三)
* 优点:起到Lazy Loading效果。
* 缺点:线程不安全,有可能实例化多个实例。
* 总结:实际开发中不可使用。
*/
class SingleTon {
private SingleTon(){};
private static SingleTon singleTon ;
public static SingleTon getInstance(){
if(singleTon == null){
synchronized (SingleTon.class){
singleTon = new SingleTon();
}
}
return singleTon;
}
}
懒汉式(四)
/**
* 懒汉式(四)
* 优点:起到Lazy Loading效果,线程安全。
* 缺点:无
* 总结:实际开发中可以使用。
*/
class SingleTon {
private SingleTon(){};
private static volatile SingleTon singleTon ;
public static SingleTon getInstance(){
if(singleTon == null){
synchronized (SingleTon.class){
if(singleTon == null){
singleTon = new SingleTon();
}
}
}
return singleTon;
}
}
懒汉式(五)
/**
* 懒汉式(五)
* 优点:静态内部类只会加载一次,起到Lazy Loading效果,线程安全。
* 缺点:无
* 总结:实际开发中可以使用。
*/
class SingleTon {
private SingleTon(){};
private static class SingleTonInstance{
private static final SingleTon INSTANCE = new SingleTon();
}
public static SingleTon getInstance(){
return SingleTonInstance.INSTANCE;
}
}
懒汉式(六)
/**
* 枚举方式
* 优点:线程安全。
* 缺点:无
* 总结:实际开发中可以使用。
*/
enum SingleTon {
INSTANCE;
public void doSomethings(){
System.out.println("嘿嘿嘿!");
}
}