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

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

单例模式:

             保证只有一个实例存在

             避免产生多个对象消耗资源,或者某种对象只应该有且仅有一个

           注意: 1.构造函数不对外开发,一般private

                        2.通过静态方法或枚举返回单例类对象
                        3.确保单例对象有且仅有一个,尤其在多线程环境下

                        4.确保单例对象在反序列化时不会重新构建对象

 

//饿汉式            public class SingleTon {          private SingleTon(){}          private static final SingleTon single = new SingleTon();          public static SingleTon getSingle(){              return single;          }      }

 

//懒汉模式            public class SingleTon{          private SingleTon(){}          private static SingleTon single = null;          public static synchronized SingleTon getSingle(){              if(single ==null){                  single = new SingleTon();              }              return single;          }      }

 

//Double check Lock(DCL)            public class SingleTon{          private SingleTon(){}          private static SingleTon single = null;          public static  SingleTon getSingle(){              if(single == null)                  synchronized(SingleTon.class){                      if(single ==null){                          single = new SingleTon();                      }                  }              return single;          }      }

 

//静态内部类                  public class SingleTon{          private SingleTon(){}          public static  SingleTon getSingle(){              return SingletoHolder.single;          }                    private static class SingletoHolder{              private static final SingleTon single = new SingleTon();          }                    private Object readResolve() {              return SingletoHolder.single;                        }                }

 

//枚举单例      public enum Single {          INSTACE;      }

 

一般情况下DCL 使用最多但是反序列化还是可以重新生成对象

private Object readResolve() throws ObjectStreamException{              return single;      }

 还有一种用容器实现:

public class SingletoManager {          private SingletoManager(){  }                    private static Map
map = new HashMap
(); public static void registerService(String key,Object instance){ if(!map.containsKey(key)){ map.put(key, instance); } } public static Object getService(String key){ return map.get(key); } }

 

转载于:https://www.cnblogs.com/smallrole/p/5639550.html

你可能感兴趣的文章
使用自定义的BaseAdapter实现LIstView的展示
查看>>
对RTMP视频流进行BitmapData.draw()出错的解决办法
查看>>
协程(Coroutine)并不是真正的多线程(转)
查看>>
java 中 ResourceBundle 使用 国际化使用
查看>>
使用Git Bash for Windows
查看>>
【087】Stylish & Greasemonkey
查看>>
uva 10626 - Buying Coke(记忆化搜索)
查看>>
WIN8.1 PRO RTM VOL.Enterprise.2013.10.17
查看>>
arcengine 要素渲染和专题图制作
查看>>
安装VS2005的sp1补丁错误,未通过数字签名检查(轉)
查看>>
Struts1 MVC框架的工作原理
查看>>
xdebug调试一直等待连接
查看>>
写个线程池
查看>>
8月14日云栖精选夜读 | 报告老板!这个阿里程序员每天上班就看别人接吻
查看>>
CentOS7(1708)制作docker镜像之后,开启sshd服务失败的处理办法
查看>>
机器人终于有触觉了!甚至可以实现膝跳反射丨Science
查看>>
Vue UI 组件库
查看>>
用代码控制网络断开与重连
查看>>
带你玩转Logview: MaxCompute Logview参数详解和问题排查
查看>>
探讨:通过循环数组或者集合,插入数据库中没有的数据
查看>>