有时候在实际项目的开发中,我们会碰到这样一种情况,该类只允许存在一个实例化的对象,不允许存在一个以上的实例化对象,我们将这种情况称为Java设计模式中的单例模式。设计单例模式主要采用了Java的private和static关键字属性。单例模式又根据是否延迟加载实例过程分为懒汉式单例模式和饿汉式单例模式。
例如下面理解一段符合单例模式的需求。假设人分为普通人和超人两种,地球上大多数都是普通人,而超人只有一个,我们在创建这两个实体类的时候就应该采用单例模式。下面是分别采用懒汉式和恶汉式单例模式的代码实现:
懒汉式单例模式的实现:
1 class SuperMan3{ //懒汉式 2 private SuperMan3(){ //私有化构造器 3 4 } 5 public static SuperMan3 s3 = null; 6 public static SuperMan3 getInstance(){ 7 if(s3==null){ 8 s3 = new SuperMan3(); 9 }10 return s3;11 }12 }
饿汉式单例模式的代码实现:
1 class SuperMan4{ //恶汉式2 private SuperMan4(){ //私有化构造器3 4 }5 private static SuperMan4 s4 = new SuperMan4();6 public static SuperMan4 getInstance(){7 return s4;8 }9 }
可以看出,取名为懒汉式和饿汉式还是很生动的,具体懒汉式和饿汉式单例模式在线程安全和资源占用上还有很多的区别,这里就不详细说明了。然后验证一下是否这两个超人类满足单例模式,我们可以在主函数中创建两个实例,然后比较它们是否相等。
1 SuperMan3 s3 = SuperMan3.getInstance();2 SuperMan3 s33 = SuperMan3.getInstance();3 System.out.println(s3==s33);//true4 5 SuperMan4 s4 = SuperMan4.getInstance();6 SuperMan4 s44 = SuperMan4.getInstance();7 System.out.println(s4==s44);//true
输出的结果都是true,可以看出无论实例化了多少个实例,最终实例之间全是相等的,即只有一个实例,满足了单例模式的需求。