`

单例模式详解

阅读更多
单例模式是众多模式中最简单的一个,了解单例模式及其应用对学习其他模式有很大帮助。但对于到底什么是单例模式,网上解释却不太容易理解,我根据自己的学习,对单例模式有了一定的了解,大家参考一下,有不对的地方请提提意见,在这里xiao yun~~先谢过了哈~~~~那么什么是单例模式呢?单例模式,是指某个类保证只创建一个实例,并且能够自己实例化这个对象而且能够向整个系统提供这个实例。显然单例模式的要点有三个;一是某各类只能有一个实例;二是它必须自行创建这个事例;三是它必须自行向整个系统提供这个实例。

单例模式又有三个变种,分别为饿汉式单例模式  、懒汉式单例模式 、登记式单例模式。

举个例子吧 

例一:饿汉式单例模式

//单态模式的理解与运用

//饿汉式单例

//为什么叫饿汉式单例呢,因为这个类一被加载就自己创建了一个对象,

//而不管你用没用到这个对象

view plaincopy to clipboardprint?

   1. public class Single { 
   2.  
   3. private static int count =0; 
   4.  
   5. //1.第一构造方法私有 
   6.  
   7. private Single(){ 
   8.  
   9. count ++; 
  10.  
  11. }; 
  12.  
  13. // 测试生成几个对象 
  14.  
  15. public static void getInfo(){ 
  16.  
  17. System.out.println(count); 
  18.  
  19. } 
  20.  
  21. //2. 由自己实例化对象 
  22.  
  23. private static final Single sl = new Single(); 
  24.  
  25. //3. 向整个系统提供本对象 
  26.  
  27. public static Single getSingle(){ 
  28.  
  29. return sl; 
  30.  
  31. } 
  32.  
  33. } 
  34.  
  35. 下面测试这个单例模式程序到底是不是能只生成一个实例 
  36.  
  37.  
  38. public class TestSingle { 
  39.  
  40. public static void main(String[] args){ 
  41.  
  42. //单利模式测试生成几个对象 
  43.  
  44. Single s1 = Single.getSingle(); 
  45.  
  46. Single s2 = Single.getSingle(); 
  47.  
  48. Single s3 = Single.getSingle(); 
  49.  
  50. Single s4 = Single.getSingle(); 
  51.  
  52. Single s5 = Single.getSingle(); 
  53.  
  54. Single.getInfo(); 
  55.  
  56. } 
  57.  
  58.  
  59. } 
  60.  
  61.  
  62. 由于例子写的注释写的很详细 我就不在具体解释了 
  63.  
  64. 下面的是饿汉式的例子 
  65.  
  66. //懒汉式单例模式 
  67.  
  68. public class Singleton { 
  69.  
  70. private static int count=0; 
  71.  
  72. private Singleton(){ 
  73.  
  74. count++; 
  75.  
  76. }; 
  77.  
  78. private static Singleton sn = null; 
  79.  
  80. synchronized public static  Singleton getSingleton(){ 
  81.  
  82. if(sn==null){ 
  83.  
  84.  sn = new Singleton(); 
  85.  
  86.  return sn; 
  87.  
  88. } 
  89.  
  90. else return sn; 
  91.  
  92. } 
  93.  
  94. public static void getInfo(){ 
  95.  
  96. System.out.println(count); 
  97.  
  98. } 
  99.  
100.  
101. } 

public class Single { private static int count =0; //1.第一构造方法私有 private Single(){ count ++; }; //测试生成几个对象 public static void getInfo(){ System.out.println(count); } //2.由自己实例化对象 private static final Single sl = new Single(); //3.向整个系统提供本对象 public static Single getSingle(){ return sl; } } 下面测试这个单例模式程序到底是不是能只生成一个实例 public class TestSingle { public static void main(String[] args){ //单利模式测试生成几个对象 Single s1 = Single.getSingle(); Single s2 = Single.getSingle(); Single s3 = Single.getSingle(); Single s4 = Single.getSingle(); Single s5 = Single.getSingle(); Single.getInfo(); } } 由于例子写的注释写的很详细 我就不在具体解释了 下面的是饿汉式的例子 //懒汉式单例模式 public class Singleton { private static int count=0; private Singleton(){ count++; }; private static Singleton sn = null; synchronized public static Singleton getSingleton(){ if(sn==null){ sn = new Singleton(); return sn; } else return sn; } public static void getInfo(){ System.out.println(count); } }

这里我要多说两句 到底懒汉和饿汉有什么区别呢 

并不是仅仅一个同步  同步只是为了保证线程安全的 ,因为 懒汉式不是和饿汉式一样,只是在需要的时候才创建实例,所以容易出现多了线程同时创建的情况  所以加上同步。现在知道他们为什么起这样奇怪的名字了吧!

接下来要说的是  什么时候才会用到单例呢  现在金融危机 就举个银行的例子吧 大家都知道银行都有总行和分行,那么总行做为一个类来说,它就应该采用单例模式,假设不是单例模式,总行可以创建多个实例,那么你在支行创建一个总行的对象存了一些钱,我也在支行创建一个对象存了一些钱,那么总行知道自己到底有多少钱么 不知道 ,因为对象不同。所以必须采取单例模式。大家会发现这两种单例有个缺点,就是不能被继承,为解决这个问题,又提出了登记式单例模式。例子我还没写出来。。。。。。。。。。待续  如果大家想学习设计模式,推荐大家一本书。《java与设计模式》,据说是国内相当来说比较好的,想要的留言,我发给你!
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics