设计模式——单例模式

来源:互联网 发布:淘宝多个客服怎么设置 编辑:程序博客网 时间:2024/06/05 22:37

单例设计模式:解决一个类在内存只存在一个对象。(保证一个类仅有一个实例,并提供一个访问它的全局访问点)

想要保证对象的唯一:

1.为了避免其他程序过多建立该类对类对象。先禁止其他程序建立该类对象。

2.还为了让其他程序可以访问到该类对象,只好在本类中,自定义一个对象。

3.为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式。

 

这三部怎代码中体现?

1.将构造函数私有化。

2.在类中创建一个本类对象。

3.提供一个方法可以获取到该对象。

 

对于事物该怎么描述还怎么描述。

当需要将该事物的对象保证在内存中唯一时,就将以上的三步加上即可。


复制代码
 1 /** 2  * 单例模式Singleton 3  * 应用场合:有些对象只需要一个就足够了. 4  * 作用:保证整个应用程序中某个实例只有一个. 5  * 类型:饿汉模式. 6  */ 7 public class Singleton { 8     //1.将构造方法私有化,不允许外部直接创建对象 9     private Singleton(){10         11     } 12     13     //2.创建类的唯一实例   使用private static修饰符14     private static Singleton instance = new Singleton();15     16     //3.提供一个用于获取实例的方法  使用public  static修饰符    (面向对象的封装性要求控制访问,不允许其他类直接访问本类的成员变量(私有化))17     public static Singleton getInstance(){18         return instance;19     }20 }

复制代码
 1 /* 2  * 对象是方法被调用时,才初始化,也叫做对象的延时加载。称为:懒汉式 3  * Single类进内存,对象还没有存在,只有调用getInstance方法,才建立对象。 4  */ 5 class Single1{ 6     private Single1(){} 7     private static Single1 s=null; 8     /* 9      * 此处可以加一个synchronized(同步),使只有一个线程可以进入该方法,避免错乱。10     * 但是每次只有一个线程可以进入导致该方法效率低。11     public static synchronized Single1 getInstance(){ 12         if(s==null)13             s=new Single1();14         return s;15     }16     */17     18     /*以下方法更为高效  双重锁定*/19     public static Single1 getInstance(){20         if(s==null){21             synchronized(Single1.class) {22                 if(s==null)23                     s=new Single1();24             }25         }    26         return s;27     }28 }

问:懒汉式为什么要使用两次 s==null 的判断?

答:对于实例对象存在的情况,直接返回,这没有问题。当实例对象s为null并且同时有两个线程调用getInstance()方法时,它们将都可以通过第一重 s==null 的判断。然后由synchronized机制,这两个线程只有一个进入,另一个在外排队等候,必须要其中一个进入并出来后,另一个才能进入。而此时如果没有第二重的 s==null ,则第一个线程创建实例对象后,第二个线程还可以继续创建新的实例对象,这就没有达到单例的目的。


饿汉模式和懒汉模式的区别:

饿汉模式的特点是加载类时比较慢(因为类一加载就是实例化对象),但运行时获取对象的速度比较快,线程安全

懒汉模式的特点是加载类时比较快,但运行时获取对象的速度比较慢,(改写后的线程安全)




0 0
原创粉丝点击