设计模式之单例设计模式

设计模式:
就是为了代码重用性高,可靠性性高,通过无数有经验的程序员总结出来的一套模块化的东西
大家要实现某个目的,就可以使用这个设计模式
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 }

这样就解决了线程安全的问题,同时在内存中也不会出现一些没有用的对象,兼顾安全与性能......