JAVA设计模式 -- 单例模式设计举例
在JAVA当中,如果我们需要创建一个对象,一般是通过该类new()一个对象,但是如果在程序当中很多地方都需要用到该对象,我们不可能这样随心所欲的通过new()来创建对象,因为每当我们new一个对象的时候,都会消耗 对应的内存资源,如果该对象的内容足够大的话,因为内存资源的有限,这种做法很不可取。 因为我们一般使用的时候往往只需要用到该对象的一个或者几个属性,并不是全部都会去调用,所以我们可以通过单例模式来解决这个问题。 单例模式又可以分为懒汉,饿汉,双重锁以及IODH这几种模式,我们可以根据实际需求进行设计:
首先,懒汉模式:
懒汉模式是单例模式的一种,对象在需要使用的地方才会被通过getinstance()方法创建
1 public class LazySingleton { 2 private static LazySingleton instance = null; 3 4 private LazySingleton() { 5 } 6 7 public static LazySingleton getInstance() { 8 if (instance == null) { 9 instance = new LazySingleton(); 10 } 11 return instance; 12 } 13 14 public static void main(String[] args) { 15 /* 16 懒汉模式是单例模式的一种,对象在需要使用的地方才会被通过getinstance()方法创建 17 */ 18 //创建3个懒汉模式对象 19 LazySingleton lsl1 = LazySingleton.getInstance(); 20 LazySingleton lsl2 = LazySingleton.getInstance(); 21 LazySingleton lsl3 = LazySingleton.getInstance(); 22 //输出,结果这三个对象的引用地址都是一样的 23 System.out.println(lsl1); 24 System.out.println(lsl2); 25 System.out.println(lsl3); 26 } 27 }
其次,饿汉模式
饿汉模式相对于懒汉模式,对象的创建和产生提前了,在类加载的时候就已经被创建,对于一些需要提前创建或者准备的类,可以使用饿汉模式来设计这个类。
1 public class EagerSingleton { 4 // 创建一个静态对象并初始化 5 private static final EagerSingleton instance = new EagerSingleton(); 6 7 // 无参构造 8 private EagerSingleton() { 9 } 10 11 // 创建获取对象的方法 12 public static EagerSingleton getInstance() { 13 return instance; //返回一开始创建的对象 14 } 15 16 public static void main(String[] args) { 17 // 创建3个对象 然后比较是否相等 18 EagerSingleton egl1 = EagerSingleton.getInstance(); 19 EagerSingleton egl2 = EagerSingleton.getInstance(); 20 EagerSingleton egl3 = EagerSingleton.getInstance(); 21 22 // 输出结果 23 System.out.println(egl1 == egl2); // true 24 System.out.println(egl2 == egl3); // true 25 } 26 }
然后是Iodh模式
Iodh模式,我看来就是对饿汉模式从设计结构上面进行了一些改进或者优化,Iodh模式在对象的创建方式上是通过内部类来实现的,来,上代码
1 public class Singleton { 2 // 创建无参构造 3 private Singleton() { 4 } 5 // 创建getinstance()方法获取对象 6 public static Singleton getInstance(){ 7 return HolderClass.instance; // 通过Holderclass这个类.属性名的方式获取对象 8 } 9 // 创建一个私有的静态的内部类 10 private static class HolderClass{ 11 // 定义一个静态常量并初始化对象 12 private final static Singleton instance = new Singleton(); 13 } 14 }