职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 454|回复: 9

对单例模式的改进

[复制链接]
愚人 发表于 2011-8-29 09:31 | 显示全部楼层 |阅读模式
给出一种对单例模式改进

  
package boke.mode;   
  
package boke.mode;   
  
/**  
* 单例模式改进  
*   
* @since jdk1.6  
* @author 毛正吉  
* @version 1.0  
* @date 2010.06.08  
*   
*/  
public class Singleton {   
      
    /**  
     *   
     * @param args  
     */  
    public static void main(String[] args) {   
        Singleton s1 = Singleton.getInstance();   
        Singleton s2 = Singleton.getInstance();   
        Singleton s3 = Singleton.getInstance();   
        Singleton s4 = Singleton.getInstance();   
        Singleton s5 = Singleton.getInstance();   
  
        System.out.println(s1 == s2);   
        System.out.println(s2 == s3);   
        System.out.println(s3 == s4);   
        System.out.println(s4 == s5);   
    }   
  
    /**  
     * 私有内部类  
     * @author 毛正吉  
     *  
     */  
    private static class SingletonCreate {   
        private static final Singleton instance = new Singleton();   
    }   
      
    /**  
     * 私有构造  
     */  
    private Singleton() {   
        System.out.println("Singleton Constructor...");   
    }   
  
    public static final Singleton getInstance() {   
  
        return SingletonCreate.instance;   
  
    }   
}  

package boke.mode;

package boke.mode;

/**
* 单例模式改进
*
* @since jdk1.6
* @author 毛正吉
* @version 1.0
* @date 2010.06.08
*
*/
public class Singleton {
       
        /**
         *
         * @param args
         */
        public static void main(String[] args) {
                Singleton s1 = Singleton.getInstance();
                Singleton s2 = Singleton.getInstance();
                Singleton s3 = Singleton.getInstance();
                Singleton s4 = Singleton.getInstance();
                Singleton s5 = Singleton.getInstance();

                System.out.println(s1 == s2);
                System.out.println(s2 == s3);
                System.out.println(s3 == s4);
                System.out.println(s4 == s5);
        }

        /**
         * 私有内部类
         * @author 毛正吉
         *
         */
        private static class SingletonCreate {
                private static final Singleton instance = new Singleton();
        }
       
        /**
         * 私有构造
         */
        private Singleton() {
                System.out.println("Singleton Constructor...");
        }

        public static final Singleton getInstance() {

                return SingletonCreate.instance;

        }
}


走失的猫咪 发表于 2011-8-29 09:31 | 显示全部楼层
请参考此条目:
http://en.wikipedia.org/wiki/Initialization_on_demand_holder_idiom

秋秋 发表于 2011-8-29 09:31 | 显示全部楼层


芷馨 发表于 2011-8-29 09:31 | 显示全部楼层
用Object Holder来实现Thread之间的visiblity.

钰云 发表于 2011-8-29 09:31 | 显示全部楼层
keshin 写道
请参考此条目:
http://en.wikipedia.org/wiki/Initialization_on_demand_holder_idiom



这篇文章将原理阐述地非常清楚~


fl 发表于 2011-8-29 09:31 | 显示全部楼层
这是延迟加载的单例模式

爱车车 发表于 2011-8-29 09:31 | 显示全部楼层
  
  
public enum Singleton{   
  
    INSTANCE   
  
  
}  

public enum Singleton{

    INSTANCE


}



fl 发表于 2011-8-29 09:32 | 显示全部楼层
magnesium 写道
  
  
public enum Singleton{   
  
    INSTANCE   
  
  
}  

public enum Singleton{

    INSTANCE


}



Effective Java

走失的猫咪 发表于 2011-8-29 09:32 | 显示全部楼层
包了一层有什么好处吗?我感觉没什么区别吧!

走就走吧 发表于 2011-8-29 09:32 | 显示全部楼层
slaser 写道
用Object Holder来实现Thread之间的visiblity.


是不是既能 做到 延迟加载, 又不需要在每次getInstance的时候加互斥锁 等待


关于类加载的过程,
哪位大侠详细讲解下啊


您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-4-27 18:02 , Processed in 0.139687 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表