设计模式之单例设计模式
设计模式:
就是为了代码重用性高,可靠性性高,通过无数有经验的程序员总结出来的一套模块化的东西
大家要实现某个目的,就可以使用这个设计模式
1.单例设计模式:
保证类在内存中只有一个对象
实现方法,先介绍两种,然后分析补充
1.1饿汉式
1 public class Singleton { 2 //饿汉式,先创建对象 3 private Singleton(){ 4 } 5 private static Singleton s = new Singleton(); 6 public static Singleton getInstance(){ 7 return s; 8 } 9 }
1.2懒汉式
1 public class Singleton { 2 //懒汉式,用的时候再创建对象 3 private Singleton(){ 4 } 5 private static Singleton s = null; 6 public static Singleton getInstance(){ 7 if (s == null) { 8 s = new Singleton(); 9 } 10 return s; 11 } 12 }
1 public class Test { 2 public static void main(String[] args) { 3 Singleton s1 = Singleton.getInstance(); 4 Singleton s2 = Singleton.getInstance(); 5 System.out.println(s1 == s2); 6 } 7 }
保证内存中只存在一个对象
首先私有化构造方法,这样在其它类中就不能创建该类的对象了,只能在本类中创建
然后实例化一个对象,对外提供公共的访问方法,必须都用static修饰
因为static,就是静态,在类加载的时候就加载的,就是说在1.1中类加载完就存在了一个对象
公共访问方法加static,主要是为了采用类名.的方式调用
第一种,做不到对象的延迟加载,可能会出现很多对象创建了而没有用的现象,浪费存储空间
第二种,存在多线程的问题,在多线程的情况下,可能内存中会出现多个对象,所以这种方式不采用
当线程1判断if (s == null) 成立的时候,切换到线程2,在创建对象,然后再切换到线程1,此时内存中已经有对象了,然而线程1还是会创建对象
所以这种情况就有问题,所以要使用加锁处理,如下
1.3加锁处理
1 public class Singleton { 2 private Singleton() {} 3 private static Singleton s = null; 4 // 双重检查 5 public static Singleton getInstance() { 6 if (s == null) { 7 synchronized (Singleton.class) { 8 if (s == null) { 9 s = new Singleton(); 10 } 11 } 12 } 13 return s; 14 } 15 }
这样就解决了线程安全的问题,同时在内存中也不会出现一些没有用的对象,兼顾安全与性能......