`
icewubin
  • 浏览: 34505 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

第三种也是最推荐的单例模式

    博客分类:
  • Java
阅读更多
public class Singleton {

    private static class Holder {
        private static final Singleton instance = new Singleton();
    }

    private Singleton() {
    }

    public static Singleton getInstance() {
        return Holder.instance;
    }
}
分享到:
评论
18 楼 icewubin 2012-07-09  
单例的东西一般都是static,或者说单例的逻辑一般都是不需要持久化的,也不需要序列化或者反序列化,没关系的。
17 楼 magicgrass 2012-07-09  
icewubin 写道
pengqb 写道
icewubin 写道
pengqb 写道
Java中我最推荐的单例模式:够简单吧,呵呵
public enum Singleton {
  instance;
}

这种方式是有限制的,你如果enum用得多就知道了,enum有很多限制,毕竟不是普通的类。

还有就是enum的单例的效果是等价于饿汉式初始化方式的,并不是最理想的需要单例时才执行单例初始化代码的模式。

见:Effective java Second Edition 第二章第3条:用私有构造器或枚举类型强化Singleton属性。里面有各种单例模式的详细比较。

你说的我又不是不知道,你怎么这么照本宣读呢?

我不是说了,enum自身有限制的么?例如enum不能继承。

很多时候为了减少类的数量,或者某个单例类中有几个public static的公共方法,或者是有几个public static的常量,此时用我推荐的方式实现单例就是最完美的。

完美的定义:
1.加载这个类的时候不会提引发单例的初始化。

2.即使调用该类的public static方法或public static的常量也不会引提前引发单例的初始化。

3.只有在需要的时候才会初始化单例,而且不需要加同步控制,由JDK自身的classloader机制来完成高效的同步控制,这里的高效是值,只有第一次初始化的时候可能产生竞争,一旦初始化完毕不再产生同步竞争。

enum方式的单例只是符合上述第三条而已。碰到混合型功能的类,或者当前单例需要继承其他类,或者需要有Spring来管理一些有状态的bean的注入的话,enum就不能满足要求了。

如果有序列化,反序列化的情况,用枚举应该会更好
16 楼 icewubin 2011-09-19  
suu 写道
博主厉害,只是有点小小疑问,静态内部类在外部类加载时不会初始化么?搜了下,说法不一,忘楼主从原因上解惑,谢谢

内部类也是个类啊,和外部类一样,什么时候会触发该类的初始化构成呢?当然是对该类的变量进行使用,或者是调用了针对该类的Class.forName()方法。
15 楼 suu 2011-09-18  
博主厉害,只是有点小小疑问,静态内部类在外部类加载时不会初始化么?搜了下,说法不一,忘楼主从原因上解惑,谢谢
14 楼 icewubin 2010-05-13  
pengqb 写道
icewubin 写道
pengqb 写道
Java中我最推荐的单例模式:够简单吧,呵呵
public enum Singleton {
  instance;
}

这种方式是有限制的,你如果enum用得多就知道了,enum有很多限制,毕竟不是普通的类。

还有就是enum的单例的效果是等价于饿汉式初始化方式的,并不是最理想的需要单例时才执行单例初始化代码的模式。

见:Effective java Second Edition 第二章第3条:用私有构造器或枚举类型强化Singleton属性。里面有各种单例模式的详细比较。

你说的我又不是不知道,你怎么这么照本宣读呢?

我不是说了,enum自身有限制的么?例如enum不能继承。

很多时候为了减少类的数量,或者某个单例类中有几个public static的公共方法,或者是有几个public static的常量,此时用我推荐的方式实现单例就是最完美的。

完美的定义:
1.加载这个类的时候不会提引发单例的初始化。

2.即使调用该类的public static方法或public static的常量也不会引提前引发单例的初始化。

3.只有在需要的时候才会初始化单例,而且不需要加同步控制,由JDK自身的classloader机制来完成高效的同步控制,这里的高效是值,只有第一次初始化的时候可能产生竞争,一旦初始化完毕不再产生同步竞争。

enum方式的单例只是符合上述第三条而已。碰到混合型功能的类,或者当前单例需要继承其他类,或者需要有Spring来管理一些有状态的bean的注入的话,enum就不能满足要求了。
13 楼 pengqb 2010-05-13  
icewubin 写道
pengqb 写道
Java中我最推荐的单例模式:够简单吧,呵呵
public enum Singleton {
  instance;
}

这种方式是有限制的,你如果enum用得多就知道了,enum有很多限制,毕竟不是普通的类。

还有就是enum的单例的效果是等价于饿汉式初始化方式的,并不是最理想的需要单例时才执行单例初始化代码的模式。

见:Effective java Second Edition 第二章第3条:用私有构造器或枚举类型强化Singleton属性。里面有各种单例模式的详细比较。
12 楼 icewubin 2010-05-08  
之所以说第三种,就是指前两种饿汉式和懒汉式各有优缺点,第三种包含前两者的优点而没有前两者的缺点,并不是单纯的追求代码简单,实际上第三种的代码并不少。
11 楼 icewubin 2010-05-08  
pengqb 写道
Java中我最推荐的单例模式:够简单吧,呵呵
public enum Singleton {
  instance;
}

这种方式是有限制的,你如果enum用得多就知道了,enum有很多限制,毕竟不是普通的类。

还有就是enum的单例的效果是等价于饿汉式初始化方式的,并不是最理想的需要单例时才执行单例初始化代码的模式。
10 楼 pengqb 2010-05-08  
Java中我最推荐的单例模式:够简单吧,呵呵
public enum Singleton {
  instance;
}
9 楼 拥抱变化之美 2009-05-13  
我以前也是这样写过,不过就是总爱遗漏 final 关键字。
8 楼 icewubin 2009-05-04  
wakin2003 写道

你的意思是利用静态类只在第一次被调用的时候初始化来实现只调用一次构造方法,既实现单例模式是吧?这个方法很特别,呵呵。不错。

是的,的确如此。
7 楼 wakin2003 2009-05-04  
icewubin 写道

wakin2003 写道
这样为啥是最佳的呢?内部类能解决多线程访问的问题么?呵呵。 就是利用Java的类加载机制,来变相的解决多线程访问的问题。

你的意思是利用静态类只在第一次被调用的时候初始化来实现只调用一次构造方法,既实现单例模式是吧?这个方法很特别,呵呵。不错。
6 楼 icewubin 2009-05-02  
天机老人 写道

我想问的是,为什么解决了线程问题就是最佳的了呢? 水平有限还忘LZ回答一下! 学习一下!

最佳是指:
1.运行效率大大优于懒汉式,因为懒汉式有一个同步过程(因为Java中无法像C++那样用双重检查,所以那个同步无法避开)。

2.同时又不像饿汉式那样,过早的触发初始化。这个过早是指:
如果有如下的变量:
public static int totalNum = 0;
如果是恶汉式的话,一调用这个变量,这个类就会初始化,而用类加载的方式的话,不会这么早就开始单例初始化。
5 楼 天机老人 2009-05-01  
我想问的是,为什么解决了线程问题就是最佳的了呢?
水平有限还忘LZ回答一下!
学习一下!
4 楼 icewubin 2009-03-05  
wakin2003 写道

这样为啥是最佳的呢?内部类能解决多线程访问的问题么?呵呵。

就是利用Java的类加载机制,来变相的解决多线程访问的问题。
3 楼 wakin2003 2009-03-05  
这样为啥是最佳的呢?内部类能解决多线程访问的问题么?呵呵。
2 楼 icewubin 2008-10-23  
zzx0421 写道

构造方法要声明为私有吧?

漏了,多谢,补上。
1 楼 zzx0421 2008-10-23  
构造方法要声明为私有吧?

相关推荐

    单例模式的七种写法

    单例模式的七种写法: 1.第一种(懒汉,线程不安全) 2.第二种(懒汉,线程安全) 3.第三种(饿汉) .....

    第三节 单例模式1

    第三节 单例模式 2一 、公众账号: 2二 、单例模式讲解: 2懒汉模式 3带锁的单例模式 3带检查锁的单例模式 4比较好的一种方式 sync.Once 5成都

    Objective C 单例模式设计源码

    NSObject类参考文档里记录第三种方法是因为历史原因遗留下来的,在当前的Objective C中已经不再使用,所以我们就不考虑这种方式了。下面让我们主要看一下前两种方式。 第一种方式,用new方法初始化其实是第二种...

    第八课 单例模式1

    1.单例模式可以构建出全局维护使用的单一实例对象,避免了变量全局污染 2.单例模式的单例对象只会在实例化的时候生成一次,之后进行返回,减少了不必要的 3.单例模

    Java设计模式之单例模式及其应用

     二、单例模式的几种形式  1. 饿汉式单例 public class Singleton { private static final Singleton singleton= new Singleton(); private Singleton(){ } public Singleton getSingleton(){ return sin

    JavaScript设计模式—单例模式详解【四种基本形式】

    单例模式也称为单体模式,其中: 1,单体模式用于创建命名空间,将系列关联的属性和方法组织成一个逻辑单元,减少全局变量。  逻辑单元中的代码通过单一的变量进行访问。 2,三个特点:  ① 该类只有一个实例;  ...

    谈一谈iOS单例模式

    单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例...第一种单例模式 //非线程安全写法 static UserHelper * helper = nil; + (UserH

    C# 设计模式系列教程-单例模式

    2. 单例模式主要有3个特点,:  2.1 单例类确保自己只有一个实例。  2.2 单例类必须自己创建自己的实例。  2.3 单例类必须为其他对象提供唯一的实例。 3. 实现方式:懒汉单例类和饿汉单例类  3.1 懒汉式单例类...

    第1章-第3节(重载、this关键字、构造器、static、final、封装、单例模式).md

    第1章-第3节(重载、this关键字、构造器、static、final、封装、单例模式).md

    Java:单例模式的七种写法

    第一种(懒汉,线程不安全): 1 public class Singleton { 2 private static Singleton instance; 3 private Singleton (){} 4 public static Singleton getInstance() { 5 if ...

    【Java设计模式】你对单例模式了解多少,一文深入探究

    目录单例模式懒汉式单例模式未初始化问题解决Double Check 双重检查方案一:不让第二步和第三步重排序-DoubleCheck方案二:基于类初始化-静态内部类饿汉式饿汉式与懒汉式最大区别序列化破坏单例模式原理枚举单例基于...

    设计模式-7种开发语言(C#、JAVA、JavaScript、C++、Python、Go、PHP).pdf

    第三节 工厂方法模式 第四节 抽象工厂模式 第五节 单例模式 第六节 外观模式 第七节 模板模式 第八节 组合模式 第九节 代理模式 第十节 命令模式 第十一节 观察者模式 第十二节 策略模式 第十三节 建造者模式 第十四...

    设计模式PPT.rar

    01第一讲简单工厂模式 02第二讲工厂方法模式 03第三讲抽象工厂模式 04第四讲工厂模式在开发中的运用 05第五讲单例模式 06第六讲原型模式 07第七讲建造者模式 08第八讲装饰模式 09第九讲策略模式 10第十讲观察者模式 ...

    设计模式第二天学习内容

    懒汉式单例模式的实现方式有三种: * 双重检查锁方式(DCL) 12345678910111213 单例模式: 懒汉式:延迟加载方式 饿汉式:立即加载 面试绝对面的都是懒汉式的问题。 单例模式如果使用不当,就容易引起线程安全问题...

    PHP中用Trait封装单例模式的实现

    单例模式的定义 确保某一个类只有一个实例,不能重复实例,只能它自己实例化,而且向整个系统提供这个实例。 解决的问题 即一个类只被实例化一次,当其他人对其再次实例化时,返回第一次实例化的对象,可以避免...

    Java与模式(清晰书签版) 设计模式 part3

    第3章 软件的可维护性和可复用性 第4章 开闭原则 第5章 专题 JAVA语言的接口 第6章 专题 抽象类 第7章 里氏代换原则 第8章 依赖倒转原则 第9章 接口隔离原则 第10章 合成、聚合复用原则 第11章 迪米特法则 第12章 ...

    Java与模式.清晰.rar

    第3章 软件的可维护性与可复用性 第4章 “开-闭”原则 第5章 专题:Java语言的接口 第6章 专题:抽象类 第7章 里氏代换原则 第8章 依赖倒转原则 第9章 接口隔离原则 第10章 合成/聚合复用原则 第11章 迪米特法则 第...

    IOS Swift3 四种单例模式详解及实例

    Swift3 单例模式 常见的有这么几种方法 第一种简单到爆的 final class Single: NSObject { static let shared = Single() private override init() {} } final关键字的作用是这个类或方法不希望被继承和重写 ...

    Head First 设计模式 JAVA源码

    第五讲:单例模式 第六讲:原型模式 第七讲:建造者模式 第八讲:装饰模式 第九讲:策略模式 第十讲:观察者模式 第十一讲:享元模式 第十二讲:代理模式 第十三讲:外观模式 第十四讲:组合模式 第十五讲...

    PHP高级程序设计-模式-框架-测试

    ” ——Amazon.com 目录第一部分 OOP和模式 第1章 抽象类、接口和契约式编程 第2章 静态变量、成员和方法 第3章 单例模式和工厂模式 第4章 异常 第5章 PHP 6中的新特性第二部分 测试和文档编写 第6章 ...

Global site tag (gtag.js) - Google Analytics