博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java设计模式中的单例模式
阅读量:6258 次
发布时间:2019-06-22

本文共 2082 字,大约阅读时间需要 6 分钟。

hot3.png

单例模式主要有3种,懒汉式,饿汉式和登记模式

先来看看它们是如何操作的:

懒汉式

//懒汉式,第一次调用时实例化,之后共用一个实例public class Singleton{//私有的默认构造子,务必是私有的,不然外部可以调用它来实例化,就无法控制实例化的只有一个了private Singleton(){}//静态private static Singleton single=null;//静态工厂方法public static Singleton getInstance(){if(single==null){single=new Singleton();}return single;}}

饿汉式

//饿汉式单例类.在类初始化时,已经自行实例化   public class Singleton1 {      //私有的默认构造子      private Singleton1() {}      //已经自行实例化       private static final Singleton1 single = new Singleton1();      //静态工厂方法       public static Singleton1 getInstance() {          return single;      }  }

懒汉式单例的实现没有考虑线程安全问题,它是线程不安全的,并发环境下很可能出现多个Singleton实例

饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以是线程安全的

登记式单例

//类似Spring里面的方法,将类名注册,下次从里面直接获取。  public class Singleton3 {      private static Map
 map = new HashMap
();      static{          Singleton3 single = new Singleton3();          map.put(single.getClass().getName(), single);      }      //保护的默认构造子      protected Singleton3(){}      //静态工厂方法,返还此类惟一的实例      public static Singleton3 getInstance(String name) {          if(name == null) {              name = Singleton3.class.getName();              System.out.println("name == null"+"--->name="+name);          }          if(map.get(name) == null) {              try {                  map.put(name, (Singleton3) Class.forName(name).newInstance());              } catch (InstantiationException e) {                  e.printStackTrace();              } catch (IllegalAccessException e) {                  e.printStackTrace();              } catch (ClassNotFoundException e) {                  e.printStackTrace();              }          }          return map.get(name);      }      //一个示意性的商业方法      public String about() {              return "Hello, I am RegSingleton.";          }          public static void main(String[] args) {          Singleton3 single3 = Singleton3.getInstance(null);          System.out.println(single3.about());      }  }

登记式单例实际上维护了一组单例类的实例,将这些实例存放在一个Map(登记薄)中,对于已经登记过的实例,则从Map直接返回,对于没有登记的,则先登记,然后返回。 

转载于:https://my.oschina.net/carbenson/blog/479593

你可能感兴趣的文章
NK3C程序配置
查看>>
webrtc中APM(AudioProcessing module)的使用2
查看>>
lunix的查看Tomcat目录下日志的快速操作
查看>>
zabbix添加邮件报警机制
查看>>
微信开放之模板消息
查看>>
Hql 中实用查询时候 引号的使用
查看>>
利用PowerShell复制SQLServer账户的所有权限
查看>>
SQLServer 维护脚本分享(10)索引
查看>>
js里父页面与子页面的相互调用
查看>>
AES加解密【示例】
查看>>
jdbc向各种数据库发送sql语句
查看>>
比特币进一步学习-针对作弊问题的处理
查看>>
Android实现手机摄像头的自动对焦
查看>>
ASCII流程图
查看>>
Linux知识积累(5) 关机shutdown和重启reboot
查看>>
HTML5为输入框添加语音输入功能
查看>>
[LeetCode] Find Permutation 找全排列
查看>>
os.environ() 说明
查看>>
Python学习札记(二十) 函数式编程1 介绍 高阶函数介绍
查看>>
tomcat安装不成功.提示:failed to install tomcat6 service ,check your setting and permissions
查看>>