------ >Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
毕老师讲到多线程的内容时,重复提到了单例设计模式的饿汉式和懒汉式,着重强调了这种设计模式的重要性,为了加深印象,下面说下我对这种设计模式的理解。
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。Java中单例模式定义:一个类有且仅有一个实例,并且自行实例化向整个系统提供。
对于像我这样的初学者来说,为什么要使用单例设计模式?单例设计模式有哪些优缺点,课上毕老师虽然也做了分析,但是概念还是有些模糊,结合自己查阅的资料理解到,一些设计场合下必须要用到单例设计模式。对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。如在Windows中就只能打开一个任务管理器。如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源;如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不符,也会给用户带来误解,不知道哪一个才是真实的状态。因此有时确保系统中某个对象的唯一性即一个类只能有一个实例非常重要。
如何保证一个类只有一个实例并且这个实例易于被访问呢?定义一个全局变量可以确保对象随时都可以被访问,但不能防止我们实例化多个对象。一个更好的解决办法是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例被创建,并且它可以提供一个访问该实例的方法。这就是单例模式的模式动机。
同其它方式一样,单例模式也有自己的优缺点:优点在是它的实例控制和灵活性,单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例;因为类控制了实例化过程,所以类可以灵活更改实例化过程。
缺点:1. 虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销。可以通过使用静态初始化解决此问题;
2. 使用单例对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用 new关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类;
3. 不能解决删除单个对象的问题。
单例设计模式有三种,包括懒汉式、饿汉式和双重锁式,常用的是饿汉式和懒汉式。
//饿汉式 class single { private static final Single s=new Single(); private Single(){} public static Single getinstance() { return s; } } //懒汉式 class Single { private static Single s=null; private Single(){} public static Single getInstance() { if(s==null) { synchronized(Single.class) { if (s==null) //---A; s= new Single(); } } return s; } }“懒汉式”与“饿汉式”的区别,是在与建立单例对象的时间不同,“饿汉式”是在不管你用的用不上,一开始就建立这个单例对象,“懒汉式”是在你真正用到的时候才去建这个单例对象。因为饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以是线程安全的。而懒汉式的实例延迟加载,多线程访问会有安全问题,可以加同步解决,同步代码块或者同步函数都可以,但是比较低效,加同步时,用到的锁是该类所属字节码文件对象。应用中出于线程安全考虑,推荐使用饿汉式。