java单例模式应用(Java的单例模式)

今天给各位分享java单例模式应用的知识,其中也会对Java的单例模式进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

1、Java程序性能优化-单例模式(1)2、java开发在什么情况下使用单例模式?3、Java模式设计之单例模式(二)

Java程序性能优化-单例模式(1)

  单例模式( )

单例模式是设计模式中使用最为普遍的模式之一 它是一种对象创建模式 用于产生一个对象的具体实例 它可以确保系统中一个类只产生一个实例 在Java语言中 这样的行为能带来两大好处

( )对于频繁使用的对象 可以省略创建对象所花费的时间 这对于那些重量级对象而言 是非常可观的一笔系统开销

( )由于new操作的次数减少 因而对系统内存的使用频率也会降低 这将减轻GC压力 缩短GC停顿时间

因此对于系统的关键组件和被频繁使用的对象 使用单例模式便可以有效地改善系统的性能

单例模式的参与者非常简单 只有单例类和使用者两个 如表 所示

表   单例模式角色

它的基本结构如图 所示

图   单例模式类图

单例模式的核心在于通过一个接口返回唯一的对象实例 一个简单的单例实现如下

public class Singleton {

private Singleton(){

System out println( Singleton is create ) //创建单例的过程可能会比较慢

}

private static Singleton instance = new Singleton()

public static Singleton getInstance() {

return instance;

}

}

注意代码中的重点标注部分 首先单例类必须要有一个private访问级别的构造函数 只有这样 才能确保单例不会在系统中的其他代码内被实例化 这点是相当重要的 其次 instance成员变量和getInstance()方法必须是static的

注意 单例模式是非常常用的一种结构 几乎所有的系统中都可以找到它的身影 因此 希望读者可以通过本节 了解单例模式的几种实现方式及其各自的特点

这种单例的实现方式非常简单 而且十分可靠 它唯一的不足仅是无法对instance实例做延迟加载 假如单例的创建过程很慢 而由于instance成员变量是static定义的 因此在JVM加载单例类时 单例对象就会被建立 如果此时 这个单例类在系统中还扮演其他角色 那么在任何使用这个单例类的地方都会初始化这个单例变量 而不管是否会被用到 比如单例类作为String工厂 用于创建一些字符串(该类既用于创建单例Singleton 又用于创建String对象)

public class Singleton {

private Singleton() {

System out println( Singleton is create )

//创建单例的过程可能会比较慢

}

private static Singleton instance = new Singleton()

public static Singleton getInstance() {

return instance;

}

public static void createString(){      //这是模拟单例类扮演其他角色

System out println( createString in Singleton )

}

}

       返回目录 Java程序性能优化 让你的Java程序更快 更稳定

编辑推荐

       Java程序设计培训视频教程

       J EE高级框架实战培训视频教程

       J ME移动开发实战教学视频

Visual C++音频/视频技术开发与实战

Oracle索引技术

lishixinzhi/Article/program/Java/gj/201311/27837

java开发在什么情况下使用单例模式?

使用原则如下:

1.单例模式:确保一个类只有一个实例,自行实例化并向系统提供这个实例

2.单例模式分类:饿单例模式(类加载时实例化一个对象给自己的引用),懒单例模式(调用取得实例的方法如getInstance时才会实例化对象)(java中饿单例模式性能优于懒单例模式,c++中一般使用懒单例模式)

单例模式(Singleton),也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。

比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。

java单例模式应用(Java的单例模式)

Java模式设计之单例模式(二)

在什么情况下使用单例模式

使用单例模式的条件

使用单例模式有一个很重要的必要条件

在一个系统要求一个类只有一个实例时才应当使用单例模式 反过来说 如果一个类可以有几个实例共存 那么就没有必要使用单例类 但是有经验的读者可能会看到很多不当地使用单例模式的例子 可见做到上面这一点并不容易 下面就是一些这样的情况

例子一

问 我的一个系统需要一些 全程 变量 学习了单例模式后 我发现可以使用一个单例类盛放所有的 全程 变量 请问这样做对吗?

答 这样做是违背单例模式的用意的 单例模式只应当在有真正的 单一实例 的需求时才可使用

一个设计得当的系统不应当有所谓的 全程 变量 这些变量应当放到它们所描述的实体所对应的类中去 将这些变量从它们所描述的实体类中抽出来 放到一个不相干的单例类中去 会使得这些变量产生错误的依赖关系和耦合关系

例子二

问 我的一个系统需要管理与数据库的连接 学习了单例模式后 我发现可以使用一个单例类包装一个Connection 对象 并在finalize()方法中关闭这个Connection 对象 这样的话 在这个单例类的实例没有被人引用时 这个finalize() 对象就会被调用 因此 Connection 对象就会被释放 这多妙啊

答 这样做是不恰当的 除非有单一实例的需求 不然不要使用单例模式 在这里Connection 对象可以同时有几个实例共存 不需要是单一实例

单例模式有很多的错误使用案例都与此例子相似 它们都是试图使用单例模式管理共享资源的生命周期 这是不恰当的

单例类的状态

有状态的单例类

一个单例类可以是有状态的(stateful) 一个有状态的单例对象一般也是可变(mutable) 单例对象

有状态的可变的单例对象常常当做状态库(repositary)使用 比如一个单例对象可以持有一个int 类型的属性 用来给一个系统提供一个数值惟一的序列号码 作为某个贩卖系统的账单号码 当然 一个单例类可以持有一个聚集 从而允许存储多个状态

没有状态的单例类

另一方面 单例类也可以是没有状态的(stateless) 仅用做提供工具性函数的对象 既然是为了提供工具性函数 也就没有必要创建多个实例 因此使用单例模式很合适 一个没有状态的单例类也就是不变(Immutable) 单例类 关于不变模式 读者可以参见本书的 不变(Immutable )模式 一章

多个JVM 系统的分散式系统

EJB 容器有能力将一个EJB 的实例跨过几个JVM 调用 由于单例对象不是EJB 因此 单例类局限于某一个JVM 中 换言之 如果EJB 在跨过JVM 后仍然需要引用同一个单例类的话 这个单例类就会在数个JVM 中被实例化 造成多个单例对象的实例出现 一个J EE应用系统可能分布在数个JVM 中 这时候不一定需要EJB 就能造成多个单例类的实例出现在不同JVM 中的情况

如果这个单例类是没有状态的 那么就没有问题 因为没有状态的对象是没有区别的 但是如果这个单例类是有状态的 那么问题就来了 举例来说 如果一个单例对象可以持有一个int 类型的属性 用来给一个系统提供一个数值惟一的序列号码 作为某个贩卖系统的账单号码的话 用户会看到同一个号码出现好几次

在任何使用了EJB RMI 和JINI 技术的分散式系统中 应当避免使用有状态的单例模式

多个类加载器

同一个JVM 中会有多个类加载器 当两个类加载器同时加载同一个类时 会出现两个实例 在很多J EE 服务器允许同一个服务器内有几个Servlet 引擎时 每一个引擎都有独立的类加载器 经有不同的类加载器加载的对象之间是绝缘的

lishixinzhi/Article/program/Java/gj/201311/27644

java单例模式应用的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于Java的单例模式、java单例模式应用的信息别忘了在本站进行查找喔。

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年4月2日 20:13:27
下一篇 2024年4月2日 20:21:41

相关推荐

  • 自学java编程,自学java编程要多久

    新手应该如何学习Java编程语言? 1、学习java的第一步是学会使用java程序语言编写程序,学习程序语言的第一步是熟悉其语法的使用。 2、Java要学的好,前期开始就一定要小功夫多练,多敲代码。把数组和字符串练熟了。你才能在开发中游刃有余。因为越到后面你就会发现语言大部分的操作都是在弄字符串和数组。其实数组就相当于一个容器。 3、培养java兴趣 初学者…

    2024年5月19日
    4000
  • java高科技塔防,一款java叫文明的塔防游戏

    国威翻盖手机有一款java三国塔防游戏,可以建造防御塔,塔里可以到木头… 1、你好,这个手机游戏现在更新了,现在游戏都是为安卓手机 设计的了,我哥哥玩梦话三国,就是塔防类的,和你说的很类似 哥哥下载的游戏在PC版应用宝里的,都是很好玩的游戏了。 2、《三国志塔防》《三国志塔防》是一款非常经典的三国塔防游戏,游戏中的画面清晰,音效逼真,玩家需要扮演…

    2024年5月19日
    3800
  • 与和或的符号java,java 与或运算

    java中&和&&是怎么运算的 1、在Java中,+=是一种复合赋值运算符,用于将某个值加到一个变量上,并将结果赋给该变量。 2、(1)public(公共访问控制符),指定该变量为公共的,他可以被任何对象的方法访问。(2)private(私有访问控制符)指定该变量只允许自己的类的方法访问,其他任何类(包括子类)中的方法均不能访问。 3…

    2024年5月19日
    3700
  • java遍历类的属性,java中遍历

    java中如何遍历实体类的属性和数据类型以及 你这里的numbers是一个对象数组,所以你可以这样遍历,单个对象是不行的。遍历对象内部成员,在反射里面有方法,我刚练习完,只有将对象的成员分解到数组中才行。 java中,dto是从db查询出来后放在list中的,所以需要遍历list。 假设需要合并的实体类是一个Java类,包含了多个字段,其中需要合并的字段名为…

    2024年5月19日
    4100
  • java对象,java对象序列化

    java判断对象是不是date类型 1、可以用正则表达式来判断 比如说:String date = 2015-05-07;//对应的正则是:\\d{4}([-]\\d{2}){2}用Pattern和Matcher匹配一下就好了。 2、Java为了支持多语言,没有固定的日期格式。你需要根据自己的需要指定日期格式,然后用DateFormat类或者SimpleDa…

    2024年5月19日
    5300
  • java获取行号,java读取指定行的内容

    Java代码中如何获文件名和行号等源码信息 1、如果你用的是Eclipse或MyEclipse,在代码的左边(就是有加号或减号,用于缩放代码的位置)点右键将Show Line Numbers打上对勾就可以看见行号了,文件名看包。 2、翻阅JDK,我们找到StackTraceElement这个类。 3、你好,我按照你的要求写的如下代码,并给足了注释,可以直接运…

    2024年5月19日
    2700
  • java输入a输出abc,java输入a输出A

    java多线程中怎么依次循环输出字母A,B,C 1、你这程序运算出来只有三种答案:A,AB,ABC。 2、实现思路:实际上就是先输入三个数,之后分别和另外两个数比较,之后从小到大进行数值替换,之后分别输出即可。 3、第二个线程用循环打印从a到b之间的字符。这句是a到z的字符吧。 用java编写随意输入一个字母显示其下一个字母例如输入a显示b输入A显&#823…

    2024年5月19日
    3700
  • java用什么web服务器,javaweb可使用哪种服务器

    红河java培训学校告诉你web服务器类型介绍? 街头流氓 Apache又称httpd server,是目前应用最广泛的web服务器,应用于各种平台。当Apache首次推出时,它有许多缺陷。现在已经修复完善了。如果你是一名web服务器研究人员,边肖建议你必须学会使用Apache。 (1) WWW服务器(WWW Server)WWW服务器也称为Web服务器(W…

    2024年5月19日
    3500
  • 扫码枪java,扫码枪灯亮但扫不出来怎么办

    Java中怎么调用扫描枪 扫描控制台输入当通过newScanner(System.in)创建一个Scanner,控制台会一直等待输入,直到敲回车键结束,把所输入的内容传给Scanner,作为扫描对象。如果要获取输入的内容,则只需要调用Scanner的nextLine()方法即可。 总之c/s架构的java程序调用扫描仪通过jni+twain编程既可完成。 比…

    2024年5月19日
    4100
  • java导出txt文件的简单介绍

    java中输出txt文件 在新建好的文件夹中新建一个文本文档,把文档名改为HelloWorld.java,并在该文档中写好如下程序。 在D盘新建两个文件test.txt,testtxt 把内容拷到test中,test1为输出。。 《java 程序》百度网盘资源免费在线观看 链接:提取码:1mur Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点…

    2024年5月19日
    3100

发表回复

登录后才能评论



关注微信