单例模式学习
来源:互联网 发布:artrage for mac 中文 编辑:程序博客网 时间:2024/05/22 00:31
单例模式关键点
1、构造函数不对外开放,private化
2、通过一个静甜方法或者枚举返回单例对象
3、确保单例类的对象有且只有一个,尤其是在多线程环境下
4、确保单例类对象在反序列化时不会重新重构对象
写法一:DCL(Double CheckLock)(满足1.2.3即绝大部分情况)
public class Singleton { /** * JDK1.5版本volatile关键字才能正常使用, * 必须使用volatile关键字 * 因为new Singleton()操作不是原子操作 * 1.给Singleton的实例分配内存 * 2.调用Singleton()的构造房函数,初始化成员字段 * 3.将sIntance对象指向分配的内存空间 */ private volatile static Singleton sInstance = null; private Singleton() { } public static Singleton getInstance() { if (sInstance == null) { synchronized (Singleton.class) { if (sInstance == null) { sInstance = new Singleton(); } } } return sInstance; }}
写法二 :静态内部类单例模式(满足1.2.3即绝大部分情况)
public class SingleInstanceDemo { //私有化构造函数,防止通过构造函数初始化对象 private SingleInstanceDemo() { } //在第一次调用getInstacnce()方法加载该静态内部类,只生产一个实例 private static class SingleInstance { private static final SingleInstanceDemo mInstance = new SingleInstanceDemo(); } //通过此方法获取对象 public static SingleInstanceDemo getInstance() { return SingleInstance.mInstance; }}
写法三:枚举类型单例模式(满足1.2.3.4)
public enum SingletonDemo{ INSTANCE; public void doSomething(){ System.out.println("la la la"); }}
例子:
RetrofitUtil单利模式封装
public class RetrofitUtil { private static Retrofit sInstance; private RetrofitUtil() { } /*超时设置*/ private static final int DEFAULT_TIMEOUT = 10; public static Retrofit getInstance() { return RetrofitHolder.mInstance; } private static class RetrofitHolder { private static final Retrofit mInstance; static { //在这里进行Retrofit的定制工作 mInstance = new Retrofit.Builder() .baseUrl(mUrl) .bulid(); } }}
以上参考《Android源码设计模式解析与实战》 何红辉,关爱民
0 0
- 单例模式学习
- 学习---单例模式
- 学习单例模式
- 单例模式学习
- 单例模式学习
- 单例模式学习
- 单例模式学习
- 单例模式学习
- 单例模式学习
- 学习单例模式
- 单例模式学习
- 单例模式学习
- 单例模式学习
- 单例模式学习
- 单例模式学习
- 单例模式学习
- 学习笔记:单例模式
- 单例模式的学习
- 生命不只有
- juicer——Demo
- 一条界破青山色:探究OpenStack落地企业之道
- Android刷机报错failed to mount /cache (No such device)
- poj2002——Squares(hash)
- 单例模式学习
- C++内存管理
- Git学习文档之一 学习文档-上传下载
- AutoCAD 2018安装破解
- java虚拟机
- NOIP 2016 换教室
- lintcode——将二叉树拆成链表
- 冒泡排序算法与选择排序算法分析(C描述)
- 前端简单处理input输入跨域攻击