`

单例模式续

阅读更多

Singleton (单例模式)

 

Intent Ensure a class only has one instance , and provide a global point of access of it.

 

瞎谈:就是保证一个类只有一个实例,并且提供一个全局可访问的点。打个比方,广州限制每户人家养狗,但是只能养一条。一开始你没有狗,你去买一条。若干年后,狗不行失踪了。你为了填补寂寞的空虚,别人又送你一条(或者还是你自己买的)。我们不关注你的狗来源,只保证你家的狗每时每刻就一条。你为了确保以后养狗方便,就到保险公司办了保险,他们承诺,你的狗要是出现意外事故,他们负责陪一条给你。从此,你自由了,狗的事情交给别人了,而且别人也保证只给一条给你。

 

正经:很多时候我们要保证类的实例只有一个。我们可能在自己的代码中判断需要的类的实例有无,无就new一个。这样看似不错。问题是,你用到这个类的地方有n个,这样你就需要n个判断。为什么不把这个职责交给类本身呢?然后让类提供一个接口访问

 

代码实现:

public class Singleton {

private static Singleton singleton=null;

private Singleton()  {}

public static Singleton instance(){

   if(singleton==null)

      singleton = new Singleton();

   return singleton

      return singleton;

}

}

 

有无问题:碰上多线程怎么办?凉拌了。加锁吧,或者。。。前人总结的经验,有3中方法

1.       直接加锁

 

public class Singleton{

private static Singleton singleton=null;

private Singleton() {}

public static synchronized Singleton instance(){

   if(singleton==null)

      singleton = new Singleton();

   return singleton

      return singleton;

}

}

 

 

 

 

2.       早期实例化

public class Singleton{

private static Singleton singleton = new Singleton();

private Singleton();

public static Singleton getInstance(){

   return singleton;

}

}

 

 

 

 

3.       双重检测锁



  •  
    1. public class Singleton   
    2.   
    3. {   
    4.   
    5.    private volatile static Singleton singleton=null;   
    6.   
    7.    private Singleton(){}   
    8.   
    9.    public static Singleton getInstance()   
    10.   
    11.    {   
    12.   
    13.               if(singleton==null)   
    14.   
    15.         {    synchronized(Singleton.class)   
    16.   
    17.                      {   
    18.                           if(singleton == null){   
    19.   
    20.                            singleton=new Singleton();   
    21.                            }   
    22.   
    23.                      }   
    24.   
    25.          }   
    26.   
    27.          return singleton;   
    28.   
    29.     }   
    30. }  
  • 
    
    
    
    
    
    
    

    
    

     4.还有一种线程安全的

     

     

     

    public class Singleton {   
      // Private constructor prevents instantiation from other classes   
      private Singleton() {}   
      
      /**  
       * SingletonHolder is loaded on the first execution of Singleton.getInstance()   
       * or the first access to SingletonHolder.INSTANCE, not before.  
       */  
      private static class SingletonHolder {    
        private static final Singleton INSTANCE = new Singleton();   
      }   
      
      public static Singleton getInstance() {   
        return SingletonHolder.INSTANCE;   
      }   
    }  
    

     

     

     

    分享到:
    评论

    相关推荐

      IOS基于ASIHttpRequest的封装,使用单例模式断点续传

      IOS基于ASIHttpRequest的封装,使用单例模式断点续传,只需传入要下载的url,即可返回一定时间内的下载进度,错误回调等

      iOS 断点续传

      项目采用封装好的方式实现断点续传功能,通过单例模式快速获取对象

      二十三种设计模式【PDF版】

      设计模式之 Singleton(单态/单件) 阎宏博士讲解:单例(Singleton)模式 保证一个类只有一个实例,并提供一个访问它的全局访问点 设计模式之 Factory(工厂方法和抽象工厂) 使用工厂模式就象使用 new 一样频繁. ...

      CS309-Object-Oriented-Programming:SUSTech课程CS309 OOP的个人回购

      CS309面向对象的程序设计SUSTech...Lab08:工厂设计模式Lab09:抽象工厂和单例设计模式Lab10:适配器设计模式Lab11:重构项目该项目由ICSE举办的软件工程学生竞赛提供SNA4Slack:Slack团队的网络分析和可视化回购: :

      leetcode下载-Note:我的笔记

      设计模式(六大基本原则、项目中常用的设计模式、手写单例等) 断点续传 volatile理解,JMM中主存和工作内存到底是啥?和JVM各个部分怎么个对应关系? 序列化,Serializable在序列化时使用了反射,从而导致GC的频繁...

      JAVA 范例大全 光盘 资源

      实例31 单例模式(Singleton) 75 实例33 开车(简单工厂模式) 77 实例33 旅游(工厂方法模式) 79 实例34 花园布局(抽象工厂模式) 80 实例35 几何图形(适配器模式) 82 第6章 字符串 85 实例36 获取字符...

      Python Cookbook

      6.15 实现单例模式 257 6.16 用Borg惯用法来避免“单例”模式 259 6.17 Null对象设计模式的实现 263 6.18 用_ _init_ _参数自动初始化实例变量 266 6.19 调用超类的_ _init_ _方法 267 6.20 精确和安全地使用...

      Java范例开发大全 (源程序)

       实例156 Singleton单例模式 242  实例157 招聘(简单工厂模式) 243  实例158 同学聚会(工厂方法模式) 244  实例159 图书展(抽象工厂模式) 246  实例160 汽车适配器(Adapter适配器模式) 248  8.4 ...

      java范例开发大全(pdf&源码)

      实例156 Singleton单例模式 242 实例157 招聘(简单工厂模式) 243 实例158 同学聚会(工厂方法模式) 244 实例159 图书展(抽象工厂模式) 246 实例160 汽车适配器(Adapter适配器模式) 248 8.4 垃圾回收 250 实例...

      java范例开发大全源代码

       实例156 Singleton单例模式 242  实例157 招聘(简单工厂模式) 243  实例158 同学聚会(工厂方法模式) 244  实例159 图书展(抽象工厂模式) 246  实例160 汽车适配器(Adapter适配器模式) 248 ...

      java范例开发大全

      实例156 Singleton单例模式 242 实例157 招聘(简单工厂模式) 243 实例158 同学聚会(工厂方法模式) 244 实例159 图书展(抽象工厂模式) 246 实例160 汽车适配器(Adapter适配器模式) 248 8.4 垃圾回收 250 实例...

      Java范例开发大全(全书源程序)

      实例156 Singleton单例模式 242 实例157 招聘(简单工厂模式) 243 实例158 同学聚会(工厂方法模式) 244 实例159 图书展(抽象工厂模式) 246 实例160 汽车适配器(Adapter适配器模式) 248 8.4 垃圾回收 ...

    Global site tag (gtag.js) - Google Analytics