第一种:饱汉模式

public class SingleTon {

private SingleTon(){

}

//实例化放在静态代码块里可提高程序的执行效率,但也可能更占用空间

private final static SingleTon instance = new SingleTon();

public static SingleTon getInstance(){

return instance;

}

}

第二种:饥汉模式

public class SingleTon {

private SingleTon(){}

private static instance = null;//new SingleTon();

public static synchronized SingleTon getInstance(){

if(instance == null)

instance = new SingleTon();

return instance;

}

}

第三种:用枚举

public enum SingleTon{

ONE;

}

第三:更实际的应用(在什么情况用单例)

public class SequenceGenerator{

//下面是该类自身的业务功能代码

private int count = 0;

public synchronized int getSequence(){

++count;

}

//下面是把该类变成单例的代码

private SequenceGenerator(){}

private final static instance = new SequenceGenerator();

public static SingleTon getInstance(){

return instance;

}

}

第四:

public class MemoryDao

{

private HashMap map = new HashMap();

public void add(Student stu1){

map.put(SequenceGenerator.getInstance().getSequence(),stu1);

}

//把MemoryDao变成单例

}

Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。

一般Singleton模式通常有几种种形式:

第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。

public class Singleton {

private Singleton(){}

      //在自己内部定义自己一个实例,是不是很奇怪?

      //注意这是private 只供内部调用

      private static Singleton instance = new Singleton();

      //这里提供了一个供外部访问本class的静态方法,可以直接访问  

      public static Singleton getInstance() {

        return instance;   

      }

}

第二种形式:

public class Singleton {

  private static Singleton instance = null;

  public static synchronized Singleton getInstance() {

  //这个方法比上面有所改进,不用每次都进行生成对象,只是第一次     

  //使用时生成实例,提高了效率!

  if (instance==null)

    instance=new Singleton();

return instance;   

}

}

其他形式:

定义一个类,它的构造函数为private的,所有方法为static的。

一般认为第一种形式要更加安全些

最新文章

  1. JavaScript简单对象的定义方法
  2. AJAX初探,XMLHttpRequest介绍
  3. spring-poi-excle往单元格写入图片
  4. css transform skew变换
  5. Freemarker 浅析 (zhuan)
  6. jsp和servlet的区别
  7. JS编码,解码. asp.net(C#)对应解码,编码
  8. PHP 归并排序
  9. 我的eclipse插件推荐
  10. 宙斯是一个完整的Hadoop的作业平台[转]
  11. jdbc ,jdbcTemplate,MyBatis,Hibernate比较与分析
  12. JavaScript+svg绘制的一个动态时钟
  13. 2101: Bake Off
  14. vue-devtools的安装与使用
  15. VS 2017 激活码
  16. 关闭Cadence Orcad Capture CIS原理图弹出startpage页面的方法
  17. Java Deadlock Example and How to analyze deadlock situation
  18. Android中利用C++处理Bitmap对象
  19. 通过adb把apk安装到系统分区
  20. Shell--nl命令

热门文章

  1. js中如何快速获取数组中的最大值最小值
  2. 百度地图JavaScript如何清除指定类型的覆盖物
  3. C# DateTime 月第一天和最后一天 取法
  4. WPF Demo10 嵌套Winform、RadGridView、
  5. vue+node+mongoDB前后端分离个人博客(入门向)
  6. Bootstrap table的一些简单使用总结
  7. ES之六:ElasticSearch中Filter和Query的异同
  8. zclip复制到剪切板插件有个bug
  9. BPM编程模型(场景)
  10. 显式锁(二)Lock接口与显示锁介绍