单例模式
问题描述:设计单例模式的实现。
分析:单例模式,即要求在整个程序中,某个类有且只有一个实例对象。因为在有些时候,我们只需要类有一个对象就行,这个时候我们就可以把这个类采用单例模式实现,
例如系统的一些对象,比如时间等对象就可以设计为单例模式。
常见的单例模式有两种类型:饿汉模式和懒汉模式。具体区别如下:
饿汉模式:加载类时比较慢(因为要创建对象),运行时获取对象的速度比较快,线程安全
懒汉模式:加载类时比较快(因为不用创建对象),运行时获取对象的速度比较慢,线程不安全
为了便于读者理解,我写出了如下Java代码,分别实现了饿汉模式和懒汉模式,读者可以结合代码理解:
饿汉模式如下:
1 /* 2 * 饿汉模式的实现Singleton1 3 */ 4 public class Singleton1 { 5 //1.将构造方法私有化,不允许外部直接创建对象 6 private Singleton1(){ 7 8 } 9 //2.创建类的唯一实例 10 private static Singleton1 instance=new Singleton1(); 11 //3.提供一个用于获取实例的方法 12 public static Singleton1 getInstance(){ 13 return instance; 14 } 15 16 }
懒汉模式如下:
1 /* 2 * 懒汉模式的实现Singleton2 3 */ 4 public class Singleton2 { 5 //1.将构造方法私有化,不允许外部直接创建对象 6 private Singleton2(){ 7 8 } 9 //2.创建类的唯一实例 10 private static Singleton2 instance; 11 //3.提供一个用于获取实例的方法 12 public static Singleton2 getInstance(){ 13 if(instance==null) 14 instance=new Singleton2(); 15 return instance; 16 } 17 }
测试代码如下:
1 public class Test { 2 3 public static void main(String[] args) { 4 // TODO 自动生成的方法存根 5 Singleton1 s1=Singleton1.getInstance(); 6 Singleton1 s2=Singleton1.getInstance(); 7 if(s1==s2){ 8 System.out.println("s1和s2是同一个实例"); 9 } 10 else System.out.println("s1和s2不是同一个实例"); 11 12 Singleton2 s3=Singleton2.getInstance(); 13 Singleton2 s4=Singleton2.getInstance(); 14 if(s3==s4){ 15 System.out.println("s3和s4是同一个实例"); 16 } 17 else System.out.println("s3和s4不是同一个实例"); 18 } 19 20 }
输出结果为:
s1和s2是同一个实例
s3和s4是同一个实例