java单例模式的实现方法_JAVA单例模式的几种实现方法

1 饿汉式单例类.在类初始化时,已经自行实例化

class EagerSingleton {

private static final EagerSingleton m_instance = new EagerSingleton();

/** * 私有的默认构造子 */

private EagerSingleton() {

}

/**

* * 静态工厂方法

*/

public static EagerSingleton getInstance() {

return m_instance;

}

}

2 懒汉式单例类.在第一次调用的时候实例化

class LazySingleton {

// 注意,这里没有final

private static LazySingleton m_instance = null;

/** * 私有的默认构造子 */

private LazySingleton() {

}

/**

* * 静态工厂方法

*/

public synchronized static LazySingleton getInstance() {

if (m_instance == null) {

m_instance = new LazySingleton();

}

return m_instance;

}

}          在上面给出懒汉式单例类实现里对静态工厂方法使用了同步化,以处理多线程环境。有些设计师在这里

建议使用所谓的"双重检查成例".必须指出的是,"双重检查成例"不可以在Java 语言中使用。不十分熟

悉的读者,可以看看后面给出的小节。

同样,由于构造子是私有的,因此,此类不能被继承。饿汉式单例类在自己被加载时就将自己实例

化。即便加载器是静态的,在饿汉式单例类被加载时仍会将自己实例化。单从资源利用效率角度来讲,

这个比懒汉式单例类稍差些。

从速度和反应时间角度来讲,则比懒汉式单例类稍好些。然而,懒汉式单例类在实例化时,必须处

理好在多个线程同时首次引用此类时的访问限制问题,特别是当单例类作为资源控制器,在实例化时必

然涉及资源初始化,而资源初始化很有可能耗费时间。这意味着出现多线程同时首次引用此类的机率变

得较大。

饿汉式单例类可以在Java 语言内实现, 但不易在C++ 内实现,因为静态初始化在C++ 里没有固定

的顺序,因而静态的m_instance 变量的初始化与类的加载顺序没有保证,可能会出问题。这就是为什么

GoF 在提出单例类的概念时,举的例子是懒汉式的。他们的书影响之大,以致Java 语言中单例类的例子

也大多是懒汉式的。实际上,本书认为饿汉式单例类更符合Java 语言本身的特点。

3 登记式单例类.类似Spring里面的方法,将类名注册,下次从里面直接获取。 查看复制到剪切板打印

import java.util.HashMap;

class RegSingleton {

static private HashMap m_registry = new HashMap();

static {

RegSingleton x = new RegSingleton();

m_registry.put(x.getClass().getName(), x);

}

/** * 保护的默认构造子 */

protected RegSingleton() {

}

/** * 静态工厂方法,返还此类惟一的实例 */

static public RegSingleton getInstance(String name) {

if (name == null) {

name = RegSingleton.class.getName();

}

if (m_registry.get(name) == null) {

try {

m_registry.put(name, Class.forName(name).newInstance());

} catch (Exception e) {

System.out.println("Error happened.");

}

return (RegSingleton) (m_registry.get(name));

}

return null;

}

/** * 一个示意性的商业方法 */

public String about() {

return "Hello, I am RegSingleton.";

}

}

class RegSingletonChild extends RegSingleton {

public RegSingletonChild() {

}

/** * 静态工厂方法 */

static public RegSingletonChild getInstance() {

return (RegSingletonChild) RegSingleton.getInstance

("com.javapatterns.singleton.demos.RegSingletonChild");

}

/** * 一个示意性的商业方法 */

public String about() {

return "Hello, I am RegSingletonChild.";

}

}

转自:http://langfangwangbin.blog.163.com/blog/static/1005436342008112711449788/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/409584.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python链表排序_链表排序+末尾各种排序

#工具人排序def nums_sort(data):if not data:return []min_data min(data)max_data max(data)nums [0]*(max_data-min_data1)for value in data:nums[value-min_data]1cur min_datafor index in range (len(data)):while cur< max_data and nums[cur-min_data]<0:cu…

sl animation sample

http://samples.msdn.microsoft.com/Silverlight/SampleBrowser/index.htm#/?srefdoubleanimation 转载于:https://www.cnblogs.com/songtzu/archive/2012/09/05/2672445.html

python中cumsum_在python里“np.cumsum”这个命令是干什么的?怎么使用?

展开全部累计2113求和的命令。5261具体例子如下所示4102&#xff1a;>>> a np.array([[1,2,3], [4,5,6]])>>> aarray([[1, 2, 3],[4, 5, 6]])>>> np.cumsum(a)array([ 1, 3, 6, 10, 15, 21])>>> np.cumsum(a, dtypefloat) # specif…

java rgb转yuv_【转】总结各种RGB转YUV的转换公式

最近在学习视频的颜色空间转换&#xff0c;由于摄像机拍出来的视频很多都是用YUV格式保存的&#xff0c;而颜色空间的转换必须在RGB颜色模型上才能完成&#xff0c;所以第一步自然就是将YUV颜色模型转成RGB颜色模型。在网上查到了许多的YUV与RGB互转的公式&#xff0c;但是总觉…

EDM数据库营销是什么?-EDM数据库营销的概念

可能有些朋友对EDM数据库营销的概念不是很了解。本文就为大家详细讲解一下EDM数据库营销是什么。 EDM数据库营销依然是大部分营销公司的主打产品。但是伴随着B2C的EDM数据库营销的市场不断扩大&#xff0c;一些EDM数据库营销公司已经感觉到其中的商机&#xff0c;纷纷建立自己的…

python两列数据生成邻接矩阵_用python实现邻接矩阵转换为邻接表,python语言实现...

graph {A: [B, C],B: [C, D],C: [D],D: [C,G,H],E: [F],F: [C]}#从图中找出任意一条从起始顶点到终止顶点的路径def find_path(graph, start, end, path[]):if start end:print "path", pathreturn Trueif not graph.get(start):path.pop()return Falsefor v in gr…

驱动程序开发的模具

自从有了操作系统后&#xff0c;就诞生了一种职位叫&#xff1a;驱动程序开发。本文描叙驱动开发所需要的学习方式。 开发驱动程序和编写应用程序之间的区别从招聘岗位可以看出&#xff1a;程序设计师和驱动开发师&#xff0c;它们是设计和开发的区别。设计重点在需求阶段&…

java圆形进度条_可拖拽圆形进度条组件(支持移动端)

好久之前写过一个可拖拽圆形进度条的dome&#xff0c;中间有网友反馈过一些问题&#xff0c;最近比较闲有时间修改了一些问题也做了一些优化&#xff0c;并封装成组件&#xff0c;基于canvas实现&#xff0c;只需传入放置组件dom容器&#xff0c;任何框架均可直接使用&#xff…

java注解 interface_java @FunctionalInterface注解详解

下面要给大家介绍的就javaFunctionalInterface注解&#xff0c;对于FunctionalInterface注解不大了解的人&#xff0c;可以通过下面的文章来了解一下哦。在学习Lambda表达式的时候&#xff0c;假如&#xff0c;接口中只有一个抽象方法(可以包含多个默认方法或多个 static方法)&…

如何用python新建文件夹_用Python编写一个每天都在系统下新建一个文件夹的脚本...

这个程序的功能非常的简单&#xff0c;就是每天在系统中新建一个文件夹。文件夹即当前的时间。此代码是在同事那边看到的&#xff0c;为了锻炼下自己薄弱的Python能力&#xff0c;所以花时间重新写了一个。具体代码如下&#xff1a;import time,osbasePath F:\\work\\thisYear…

u盘无法复制文件进去_只需一招,禁止Windows复制文件到U盘,再也不用担心你的资料被拷走!...

现在&#xff0c;我们日常的生活和工作都是电脑全程陪伴&#xff0c;可以说是离不开电脑了。也正是因为电脑的功能那么多&#xff0c;而且在保存资料方面&#xff0c;相比纸质资料来讲&#xff0c;确实有十分大的优势&#xff01;因此&#xff0c;有许多人都会将一些重要的个人…

ZOJ 3631 Watashi's BG

这道题思路不难&#xff0c;用01背包的思想来解这道题&#xff0c;一个M的背包装N个物品&#xff0c;这N个物品的权值和 体积都是vi&#xff0c;很简单的一个模型&#xff0c;直接用背包的方法解的话&#xff0c;不止会超内存&#xff0c;而且会超时&#xff0c;这 样WA了一遍之…

java word 饼图_[Java教程]echarts标准饼图解读(一)——基本配置demo

[Java教程]echarts标准饼图解读(一)——基本配置demo0 2016-11-21 17:00:18echarts标准饼图解读共分为四部分&#xff0c;一、基本配置demo二、标题(title)配置三、提示框(tooltip)配置四、图例(legend)配置五、系列列表(series )配置下面是一个基本配置demo&#xff0c;复制下…

常见音频接口详解

音频接口分为模拟和数字音频接口两种。模拟音频接口&#xff1a;&#xff08;1&#xff09;线路&#xff08;LINE&#xff09;接口&#xff1a;是视音频设备互联时使用最多的音频接口&#xff0c;分为专业设备线路接口和非专业设备线路接口。专业设备线路接口&#xff08;平衡口…