java单例模式实例
什么是单例模式?
定义:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例场景,也就是说:确保某个类有且只有一个对象的场景,避免产生多个对象消耗过多的资源,或者某种类型的对象应该有且只有一个。
UML类图:

构建单例模式的关键:
1.构造函数不对外开放,一般为Private
2.通过一个静态方法或者枚举返回单例类对象
3.确保单例类的对象有且只有一个,尤其是多线程的环境下
4.确保单例类对象在反序列化时不会重新构建对象
单例模式构建方式:
1.饿汉模式
2.懒汉模式(Double Check)
3.静态内部类的单利模式
4.枚举单例模式
5.容器实现单例模式
代码示例:
1.饿汉模式
- public class Singleton {
- private Singleton(){
- }
- private static final Singleton Instance=new Singleton();
- public Singleton getInstance(){
- return Instance;
- }
- }
2. 懒汉模式(Double Check)
- public class Singleton {
- private Singleton(){
- }
- private static Singleton Instance=null;
- public Singleton getInstance(){
- if(Instance==null){
- synchronized (Singleton.class) {
- if(Instance==null)
- {
- Instance=new Singleton();
- return Instance;
- }
- }
- }
- return Instance;
- }
- }
3.静态内部类单例模式
- public class Singleton {
- private Singleton(){}
- private static Singleton getInstance(){
- return SingletonHolder.Instance;
- }
- /**
- * 静态内部类
- */
- private static class SingletonHolder{
- private static final Singleton Instance = new Singleton();
- }
- }
当第一次加载Singleton类时,并不会初始化Instance,只有在第一次调用Singleton的getInstance方法时,才会导致
Instance 被初始化。第一次调用 getInstance
方法会导致虚拟机加载SingletonHolder类,这种方式不仅能够确保线程安全,也能够保证单例对象的唯一性,同时也延迟了单例对象的实例化,所以推荐使用这种方法。
4.枚举单例
- public enum SingletonEnum{
- INSTANCE;
- public void doSomething(){
- System.out.println("do sth.");
- }
- }
5.使用容器实现单例模式
- public class SingletonManager {
- private static Map<String, Object> objMap = new HashMap<String, Object>();
- private SingletonManager(){ }
- //将多种单例类型注入到一个统一的管理类,在使用时根据key获取对象对应类型的对象
- public static void registerService(String key, Object instance)
- {
- if(!objMap.containsKey(key)){
- objMap.put(key, instance);
- }
- }
- public static Object getService(String key){
- return objMap.get(key);
- }
- }
这种容器单例模式的实现,在Android中,我们使用的Context的getSystemService(key)的方式,就是利用的容器单例模式。eg:WIndowsManagerService、ActivityManagerService等等。在虚拟机第一次加载该类时,会注册各种Service,这些服务以键值对的形式存储在一个HashMap中,用户使用时只需要根据key来获取到对应的具体服务对象了。
java单例模式实例的更多相关文章
- 用java单例模式实现面板切换
1.首先介绍一下什么是单例模式: java单例模式是一种常见的设计模式,那么我们先看看懒汉模式: public class Singleton_ { //设为私有方法,防止被外部类引用或实例 priv ...
- 【深入】java 单例模式(转)
[深入]java 单例模式 关于单例模式的文章,其实网上早就已经泛滥了.但一个小小的单例,里面却是有着许多的变化.网上的文章大多也是提到了其中的一个或几个点,很少有比较全面且脉络清晰的文章,于是,我便 ...
- 深入Java单例模式(转)
深入Java单例模式 源自 http://devbean.blog.51cto.com/448512/203501 在GoF的23种设计模式中,单例模式是比较简单的一种.然而,有时候越是简单的东西越容 ...
- Java 单例模式的七种写法
Java 单例模式的七种写法 第一种(懒汉,线程不安全) public class Singleton { private static Singleton instance; private Sin ...
- java单例模式之懒汉式分析
转自:http://blog.csdn.net/withiter/article/details/8140338 今天中午闲着没事,就随便写点关于Java单例模式的.其实单例模式实现有很多方法,这里我 ...
- Java 单例模式探讨
以下是我再次研究单例(Java 单例模式缺点)时在网上收集的资料,相信你们看完就对单例完全掌握了 Java单例模式应该是看起来以及用起来简单的一种设计模式,但是就实现方式以及原理来说,也并不浅显哦. ...
- 单例模式:Java单例模式的几种写法及它们的优缺点
总结下Java单例模式的几种写法: 1. 饿汉式 public class Singleton { private static Singleton instance = new Singleton( ...
- 9种Java单例模式详解(推荐)
单例模式的特点 一个类只允许产生一个实例化对象. 单例类构造方法私有化,不允许外部创建对象. 单例类向外提供静态方法,调用方法返回内部创建的实例化对象. 懒汉式(线程不安全) 其主要表现在单例类在外 ...
- 你真的理解了java单例模式吗?讲别人都忽略的细节!
前言:老刘这篇文章敢做保证,java的单例模式讲的比大多数的技术博客都要好,讲述别人技术博客都没有的细节!!! 1 java单例模式 直接讲实现单例模式的两种方法:懒汉式和饿汉式,单例模式的概念自己上 ...
随机推荐
- YOLOv2训练自己的数据集(VOC格式)
下周试试,参考:http://blog.csdn.net/ch_liu23/article/details/53558549 http://blog.csdn.net/sinat_30071459/a ...
- ConvertUtils.register的作用
BeanUtils的populate方法或者getProperty,setProperty方法其实都会调用convert进行转换 但Converter只支持一些基本的类型,甚至连Java.util.D ...
- 002_JavaSE笔记:单例模式
一.应用杨景 在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例.这些应用都或多或少具有资源管理器的功能.每台计算机可以有若干个打印机,但只能有一个Printer ...
- Java第三阶段学习(十二、HttpServletRequest与HttpServletResponse)
一.HttpServletRequest 1.概述: 我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和 ...
- 【LOJ】#2509. 「AHOI / HNOI2018」排列
题解 虽然要求一个dfs序,但是不是从根开始贪心 从最小的点开始贪心,最小的点显然是父亲选了之后马上就选它 那么我们每次把最小的点和父亲合并,两个联通块之间也是如此 对于两个联通块,他们合并的顺序应该 ...
- Successor hdu 4366 线段树
题意: 现在n个人,其中编号0的是老板,之后n-1个员工,每个员工只有一个上司,有一个忠诚值和能力值.每次要解雇一个人的时候,从他的下属中选取能力值大于他的且忠诚值最高的一个,若不存在则输出-1.共m ...
- 那些年我们踩过的坑之表单reset
开发者往往是在一个又一个的坑中成长起来的,自学的开发者尤其如此,刚刚填完一个坑,转身又掉进另一个坑.有些坑很容易就跳出来了,也有些坑能整了一天都没头绪,第二天早上一来发现后面就有一架通往坑外的梯子,坑 ...
- linux学习笔记-7.文件属性
1.查看文件夹属性 ls -ld test 2.文件夹的rwx --x:可以cd进去r-x:可以cd进去并ls-wx:可以cd进去并touch,rm自己的文件,并且可以vi其他用户的文件-wt:可以c ...
- 【Ray Tracing in One Weekend 超详解】 光线追踪1-7 Dielectric 半径为负,实心球体镂空技巧
今天讲这本书最后一种材质 Preface 水,玻璃和钻石等透明材料是电介质.当光线照射它们时,它会分裂成反射光线和折射(透射)光线. 处理方案:在反射或折射之间随机选择并且每次交互仅产生一条散射光线 ...
- Java 操纵XML之读取XML文件
Java 操纵XML之读取XML文件 一.JAVA DOM PARSER DOM interfaces The DOM defines several Java interfaces. Here ar ...