在开发中,经常会提到设计模式(design pattern)。其实,设计模式就是一套被反复使用、多数人知晓的、经过分类的代码设计经验的总结。设计模式常被有经验的面向对象的软件开发人员所采用,是软件开发人员在软件开发过程中面临的一般问题的解决方案,而这些解决方案是众多软件开发人员经过相当长的一段时间实践总结出来的。我们学习和使用设计模式可以提高代码的重用性、可理解性和可靠性。经典的设计模式有GoF的23种设计模式,大体分为创建型模式、结构型模式和行为型模式三大类。
本节学习的单例模式(singleton pattern)属于一种对象创建型模式。单例模式的意图是保证系统中,应用该模式的类只有一个实例,并提供一个全局访问点。
单例模式的实现有多种方式,例如饿汉式、懒汉式、静态内部类等。饿汉式是指单例类在加载的时候对象就被创建,饿汉式的优点是线程安全,无须同步,因此调用效率高,缺点是不能延时加载,从类加载后就会一直占用内存;懒汉式并非在类加载时就初始化单例对象,而是在需要该单例对象时再初始化该对象,懒汉式的优点是可以延时加载,缺点是需要考虑线程安全问题,调用效率低;静态内部类兼顾了效率和延迟加载,避免了线程不安全,同时利用静态内部类实现延迟加载,效率高。
【例3-10】
设计一个饿汉式单例类并测试。
程序如图3-23所示。
图3-23 单例模式(饿汉式)
饿汉式单例模式实现步骤:
(1)私有化构造方法,外界不能创建对象。
(2)设置一个私有的静态成员变量,指向一个实例化对象,该对象在类加载时创建。
(3)通过提供一个公共的静态方法来获取创建的单例对象。
下面通过测试用例My Circle6Test来演示该单例模式,如图3-24所示。
图3-24 单例模式(饿汉式)测试
由上可知,在第一次加载My Circle6类时,将静态引用变量instance存放在方法区的静态区,同时执行显式初始化,在内存堆里创建一个对象,将对象地址赋值给静态引用变量instance。由于该类的构造方法被私有化封装,外部My Circle6Test类无法再创建新的MyCircle6对象。同时,My Circle6类为外部提供了一个全局静态方法getInstance,通过该方法可以获得该类的单例对象,调用多次返回的是同一个对象。
【例3-11】
设计一个懒汉式单例类并测试。(www.xing528.com)
程序如图3-25所示。
图3-25 单例模式(懒汉式)
懒汉式单例模式的实现有很多方式,本例是其中一种。实现步骤为:
(1)私有化构造方法,外界不能创建对象。
(2)设置一个私有的静态成员变量,保存单例的引用,默认值为null。
(3)通过提供一个公共的静态方法获取单例对象。延迟到第一次调用getInstance方法时创建对象,考虑多线程安全问题,本例采用了同步方法,即一次只有一个线程能访问该方法,降低了效率。
下面通过测试用例My Circle7Test来演示懒汉式单例模式,如图3-26所示。
图3-26 单例模式(懒汉式)测试
【例3-12】
设计一个使用静态内部类实现的单例类。
程序如图3-27所示。
图3-27 单例模式(静态内部类)
使用该类,在外部类Singleton加载的时候,静态内部类Holder并没有被加载进去;当执行Singleton.getInstance()时,才加载静态内部类Holder。可见,利用静态内部类实现的单例模式,特点是,当外部类被装载的时候静态内部类并不会被装载,而当内部类延迟加载的时候也不会发生线程同步问题。
总之,单例模式下,类必须在合适时机自己创建自己的唯一实例,同时必须提供访问该唯一实例的公共方法。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。