开发者社区> 啊啊啊88jdk> 正文

设计模式——单例模式

简介: 单例模式 定义 确保某一个类只有一个实例,并且自行实例化并向整个系统提供这个实例。 使用场景 确保某个类有且只有一个,避免产生过多对象消耗过多的资源,比如,太阳只有一个,地球只...
+关注继续查看

单例模式

定义

确保某一个类只有一个实例,并且自行实例化并向整个系统提供这个实例。

使用场景

确保某个类有且只有一个,避免产生过多对象消耗过多的资源,比如,太阳只有一个,地球只有一个……

关键点

  • 构造函数不对外开放,一般为private
  • 通过一个静态方法或者枚举返回单例类对象
  • 对象有且只有一个,尤其是在多线程下
  • 确保在反序列的时候不会重复构建对象

实现

饿汉单例模式

public class HungerSingleton {

    private static final String TAG = "HungerSingleton";

    private static final HungerSingleton mHungerSingleton = new HungerSingleton();

    private HungerSingleton() {
        Log.i(TAG, "HungerSingleton: ");
    }

    public static HungerSingleton getInstance() {
        return mHungerSingleton;
    }

    @Override
    public String toString() {
        return "I am " + TAG + "!";
    }
}

懒汉单例模式

  • 优点:使用的时候才进行初始化,节约了资源
  • 缺点:第一次初始化较慢,每次都同步造成不必要的开销
  • 结论:不推荐使用
public class LazySingleton {

    private static final String TAG = "LazySingleton";

    private static LazySingleton mLazySingleton;

    private LazySingleton() {
        Log.i(TAG, "LazySingleton: ");
    }

    /**
     * 获取单例
     * synchronized 确保在多线程下对象唯一行
     *
     * @return 单例
     */
    public static synchronized LazySingleton getInstance() {
        if (null == mLazySingleton) {
            mLazySingleton = new LazySingleton();
        }
        return mLazySingleton;
    }

    @Override
    public String toString() {
        return "I am " + TAG + "!";
    }
}

Double Check Lock(DCL)单例模式

  • 优点:在懒汉单例的基础上,不会多次执行同步操作,资源利用率高,效率高。
  • 缺点:第一次加载较慢
  • 结论:使用最多的单例实现方式
public class DCLSingleton {
    private static final String TAG = "DCLSingleton";

    private volatile static DCLSingleton mDCLSingleton = null;

    private DCLSingleton() {
        Log.i(TAG, "DCLSingleton: ");
    }

    public static DCLSingleton getInstance() {
        if (null == mDCLSingleton) { // 避免重复不必要的同步
            synchronized (DCLSingleton.class) { // 确保多线程下对象唯一
                if (null == mDCLSingleton) { // 非空的情况下创建实例
                    mDCLSingleton = new DCLSingleton();
                }
            }
        }
        return mDCLSingleton;
    }

    @Override
    public String toString() {
        return "I am " + TAG + "!";
    }
}

静态内部类单例模式

  • 优点:线程安全,保证对象唯一,延迟了实例化,
  • 结论:推荐使用
public class StaticInnerClassSingleton {
    private static final String TAG = "StaticInnerClassSinglet";

    private StaticInnerClassSingleton() {
        Log.i(TAG, "StaticInnerClassSingleton: ");
    }

    public static StaticInnerClassSingleton getInstance() {
        return SingletonHolder.staticInnerClassSingleton;
    }

    private static class SingletonHolder {
        private static final StaticInnerClassSingleton staticInnerClassSingleton = new StaticInnerClassSingleton();
    }

    @Override
    public String toString() {
        return "I am " + TAG + "!";
    }
}

结论

  1. 构造方法私有化
  2. 通过静态方法获取一个唯一的实例
  3. 保证线程安全

单例对象如果持有Context,很容易造成内存泄漏,最好传递ApplicationContext

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
一起来学设计模式之单例模式
前言 目前正在出一个设计模式专题系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~ 本节给大家讲一下设计模式中的单例模式~ 本专题的所有案例代码主要以Java语言为主, 好了, 废话不多说直接开整吧~ 单例模式 上节带大家看了一下设计模式的基本概念,本节带大家一起实现一下设计模式中的单例模式。 单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点。 单例模式适用于需要确保系统中只有一个实例,并且需要提供一个全局访问点的场景,比如线程池、日志系统、配置文件管理器等。
7 0
设计模式 | 单例模式
单例模式:确保一个类只有一个实例对象,并提供一个全局访问点来访问这个唯一的实例。 Singleton Pattern:Ensure a class has only one instance, and provide a global point of access to it.
79 0
设计模式之单例模式
这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
32 0
【设计模式】C#实现单例模式
单例模式:某一个类在系统中只需要有一个实例对象,而且对象是由这个类自行实例化并提供给系统其它地方使用。单例模式属于一种创建型设计模式。
61 0
设计模式-单例模式
设计模式-单例模式
49 0
设计模式|单例模式
这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
52 0
设计模式—单例模式
设计模式—单例模式
76 0
设计模式—— 七 :单例模式
设计模式—— 七 :单例模式
150 0
设计模式(一)_单例模式
计划6月份学习设计模式,一共23种设计模式,先6月份学1/4吧,学习6篇,今天就以最简单的单例模式进行学习 概念:   java中单例模式是一种常见的设计模式,这里主要介绍两种:懒汉式单例、饿汉式单例。
902 0
+关注
啊啊啊88jdk
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载