020-88888888

网站建设 APP开发 小程序

SOLUTIONS/方案

为您提供更有价值的思想和方案

您当前位置>主页 > 方案 >

某类需要频繁实例化

在有些系统中,为了节减内存资源、担保数据内容的一致性,对某些类要求只能建设一个实例,这就是所谓的单例模式。 单例模式的界说与特点 单例(Singleton)模式的界说:指一个类只有一个实例,且该类能自行建设这个实例的一种模式。譬喻,Windows 中只能打开一个任务打点器,盛图娱乐,这样可以制止因打开多个任务打点器窗口而造成内存资源的挥霍,或呈现各个窗口显示内容的纷歧致等错误。

在计较机系统中,尚有 Windows 的接纳站、操纵系统中的文件系统、多线程中的线程池、显卡的驱动措施工具、打印机的靠山处理惩罚处事、应用措施的日志工具、数据库的毗连池、网站的计数器、Web 应用的设置工具、应用措施中的对话框、系统中的缓存等经常被设计成单例。

单例模式在现实糊口中的应用也很是遍及,譬喻公司 CEO、部分司理等都属于单例模子。J2EE 尺度中的 ServletContext 和 ServletContextConfig、Spring 框架应用中的 ApplicationContext、数据库中的毗连池等也都是单例模式。

单例模式有 3 个特点:

单例类只有一个实例工具;

该单例工具必需由单例类自行建设;

单例类对外提供一个会见该单例的全局会见点。

单例模式的利益和缺点 单例模式的利益:

单例模式可以担保内存里只有一个实例,淘汰了内存的开销。

可以制止对资源的多重占用。

单例模式配置全局会见点,可以优化和共享资源的会见。


单例模式的缺点:

单例模式一般没有接口,扩展坚苦。假如要扩展,则除了修改本来的代码,没有第二种途径,违背开闭原则。

在并发测试中,单例模式倒霉于代码调试。在调试进程中,假如单例中的代码没有执行完,也不能模仿生成一个新的工具。

单例模式的成果代码凡是写在一个类中,假如成果设计不公道,则很容易违背单一职责原则。

单例模式看起来很是简朴,实现起来也很是简朴。单例模式在口试中是一个高频口试题。但愿各人可以或许当真进修,把握单例模式,晋升焦点竞争力,给口试加分,顺利拿到 Offer。

单例模式的应用场景 对付 Java 来说,单例模式可以担保在一个 JVM 中只存在单一实例。单例模式的应用场景主要有以下几个方面。

需要频繁建设的一些类,利用单例可以低落系统的内存压力,淘汰 GC。

某类只要求生成一个工具的时候,如一个班中的班长、每小我私家的身份证号等。

某些类建设实例时占用资源较多,或实例化耗时较长,且常常利用。

某类需要频繁实例化,而建设的工具又频繁被销毁的时候,如多线程的线程池、网络毗连池等。

频繁会见数据库或文件的工具。

对付一些节制硬件级此外操纵,可能从系统上来讲该当是单一节制逻辑的操纵,假如有多个实例,则系统会完全乱套。

当工具需要被共享的场所。由于单例模式只答允建设一个工具,共享该工具可以节减内存,并加速工具会见速度。如 Web 中的设置工具、数据库的毗连池等。

单例模式的布局与实现 单例模式是设计模式中最简朴的模式之一。凡是,普通类的结构函数是公有的,外部类可以通过“new 结构函数()”来生成多个实例。可是,假如将类的结构函数设为私有的,外部类就无法挪用该结构函数,也就无法生成多个实例。这时该类自身必需界说一个静态私有实例,并向外提供一个静态的公有函数用于建设或获取该静态私有实例。

下面来阐明其根基布局和实现要领。 1. 单例模式的布局 单例模式的主要脚色如下。

单例类:包括一个实例且能自行建设这个实例的类。

会见类:利用单例的类。


其布局如图 1 所示。

单例模式的布局图


图1 单例模式的布局图

2. 单例模式的实现 Singleton 模式凡是有两种实现形式。
第 1 种:懒汉式单例 该模式的特点是类加载时没有生成单例,只有当第一次挪用 getlnstance 要领时才去建设这个单例。代码如下: public class LazySingleton { private static volatile LazySingleton instance = null; //担保 instance 在所有线程中同步 private LazySingleton() { } //private 制止类在外部被实例化 public static synchronized LazySingleton getInstance() { //getInstance 要领前加同步 if (instance == null) { instance = new LazySingleton(); } return instance; } } 留意:假如编写的是多线程措施,则不要删除上例代码中的要害字 volatile 和 synchronized,不然将存在线程非安详的问题。假如不删除这两个要害字就能担保线程安详,可是每次会见时都要同步,会影响机能,且耗损更多的资源,这是懒汉式单例的缺点。
第 2 种:饿汉式单例 该模式的特点是类一旦加载就建设一个单例,担保在挪用 getInstance 要领之前单例已经存在了。 public class HungrySingleton { private static final HungrySingleton instance = new HungrySingleton(); private HungrySingleton() { } public static HungrySingleton getInstance() { return instance; } }
饿汉式单例在类建设的同时就已经建设好一个静态的工具供系统利用,今后不再改变,所以是线程安详的,可以直接用于多线程而不会呈现问题。 单例模式的应用实例 【例1】用懒汉式单例模式模仿发生美国当今总统工具。

阐明:在每一届任期内,美国的总统只有一人,所以本实例适适用单例模式实现,图 2 所示是用懒汉式单例实现的布局图。

相关案例查看更多