单例模式特点:
1. 这个类只能有一个实例
2. 它必须自行创建这个实例
3. 它必须自行向整个系统提供这个实例
以下是两种实现单例模式的方式
/** */
/**
* 懒汉式单例类
*/
public class LazySingleton ... {
/** *//**
* 私有构造函数,不能被外界实例化
*/
private LazySingleton()...{
}
/** *//**
* 当本类被加载时,初始化instance为null
*/
private static LazySingleton instance = null;
/** *//***
* 公有方法,供外界调用实例化本类
* 此方法修饰符synchronized(同步)用于处理多线程
* @return
*/
static synchronized public LazySingleton getInstance()...{
if(instance==null)...{
instance = new LazySingleton();
}
return instance;
}
}
* 懒汉式单例类
*/
public class LazySingleton ... {
/** *//**
* 私有构造函数,不能被外界实例化
*/
private LazySingleton()...{
}
/** *//**
* 当本类被加载时,初始化instance为null
*/
private static LazySingleton instance = null;
/** *//***
* 公有方法,供外界调用实例化本类
* 此方法修饰符synchronized(同步)用于处理多线程
* @return
*/
static synchronized public LazySingleton getInstance()...{
if(instance==null)...{
instance = new LazySingleton();
}
return instance;
}
}
/** */
/**
* 饿汉式单例类
*/
public class EagerSingleton ... {
/** *//**
* 私有构造函数,不能被外界实例化
*/
private EagerSingleton()...{
}
/** *//***
* 私有静态变量,当类被加载时,自动实例化本类
*/
private static final EagerSingleton instance = new EagerSingleton();
/** *//***
* 公有方法,供外界调用
* @return
*/
public static EagerSingleton getInstance()...{
return instance;
}
}
* 饿汉式单例类
*/
public class EagerSingleton ... {
/** *//**
* 私有构造函数,不能被外界实例化
*/
private EagerSingleton()...{
}
/** *//***
* 私有静态变量,当类被加载时,自动实例化本类
*/
private static final EagerSingleton instance = new EagerSingleton();
/** *//***
* 公有方法,供外界调用
* @return
*/
public static EagerSingleton getInstance()...{
return instance;
}
}
比较:
1. 两种方式都不能被继承。
2. 从速度和反应时间角度来讲,饿汉式稍好些。
3. 从资源利用角度来讲,懒汉式要稍好些。
4. 在c++中,饿汉式不容易实现
5. 饿汉式更符合java语言特点