【设计模式】-- 单例模式
2017-07-04 本文已影响0人
晴岚_Lanny
单例模式Singleton
- 应用场合:有些对象只需要一个就足够了,如古代的皇帝、老婆
- 作用:保证整个应用程序中某个实例有且只有一个
- 类型:饿汉式、懒汉式
下定义,什么是饿汉懒汉式?
- 饿汉模式:只要类一加载,它就开始初始化,永远都是没有吃饱,所以叫饿汉式
- 懒汉模式:当类加载的时候,比并没有初始化实例,而是在用户获取的时候才初始化,所以叫 懒汉式
区别
- 饿汉模式,类的加载比较慢,但是运行获取对象的速度比较快,线程是安全的
- 懒汉模式,类的加载比较快,但是运行获取对象的速度比较慢,线程不安全
饿汉式
//饿汉模式
public class EagerSingleton {
//1、将构造方法私有化,不允许外部直接创建对象
private EagerSingleton() {
}
//2、创建类的唯一实例,使用private static变成为类的静态成员
private static EagerSingleton instance = new EagerSingleton();
//3、提供一个获取实例的方法,使用public static修饰
public static EagerSingleton getInstance(){
return instance;
}
}
懒汉式
//懒汉模式
public class LazySingleton {
//1、将构造方法私有化,不允许外部直接创建对象
private LazySingleton() {
}
//2、创建类的唯一实例,使用private static变成为类的静态成员
private static LazySingleton instance;
//3、提供一个获取实例的方法,使用public static修饰
public static LazySingleton getInstance(){
if(instance == null){
instance = new LazySingleton();
}
return instance;
}
}
测试
//测试
public class TestSingleton {
public static void main(String[] args) {
//饿汉式
EagerSingleton s1 = EagerSingleton.getInstance();
EagerSingleton s2 = EagerSingleton.getInstance();
if (s1 == s2) {
System.out.println("s1和s2是同一个实例");
}else{
System.out.println("s1和s2不是同一个实例");
}
//懒汉式
LazySingleton s3 = LazySingleton.getInstance();
LazySingleton s4 = LazySingleton.getInstance();
if (s3 == s4) {
System.out.println("s3和s4是同一个实例");
}else{
System.out.println("s3和s4不是同一个实例");
}
}
}
输出结果
s1和s2是同一个实例
s3和s4是同一个实例