设计模式之单例模式

单例模式应该是我们接触到的最简单的设计模式,结构简洁,代码短小,实现起来非常容易。它确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

单例模式包含如下角色:

  • Singleton:单例
    在单例类的内部实现只生成一个实例,同时它提供一个静态的工厂方法,让客户可以使用它的唯一实例;为了防止在外部对其实例化,将其构造函数设计为私有。
类图

单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。

单例模式的实现方式有饿汉式、懒汉式、静态内部类等,菜鸟教程上的单例模式总结得就很全面,要根据实际情况选择合适的方式。

我主要使用下面三种实现方式,双重校验锁和静态内部类保证了线程安全和懒加载;饿汉式做到了线程安全,在类加载时就进行实例化。

  1. 双重校验锁:
public class Singleton {  
    private volatile static Singleton singleton;  
    
    private Singleton (){
        
    }  
    
    public static Singleton getSingleton() {  
        if (singleton == null) {  
            synchronized (Singleton.class) {  
                if (singleton == null) {  
                    singleton = new Singleton();  
                }  
            }  
        }  
        return singleton;  
    }  
}  
  1. 静态内部类:
public class Singleton {  
    private static class SingletonHolder {  
        private static final Singleton INSTANCE = new Singleton();  
    }  
    
    private Singleton (){
        
    }  
    
    public static final Singleton getInstance() {  
        return SingletonHolder.INSTANCE;  
    }  
}   
  1. 饿汉式:
public class Singleton {  
    private static Singleton instance = new Singleton();  
    
    private Singleton (){
        
    }  
    
    public static Singleton getInstance() {  
        return instance;  
    }  
}  

单例模式的优点:提供了对唯一实例的受控访问并可以节约系统资源。
缺点:由于缺少抽象层而难以扩展,而且单例类职责过重。
使用场景:系统只需要一个实例对象;客户调用类的单个实例只允许使用一个公共访问点。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前言 本文主要参考 那些年,我们一起写过的“单例模式”。 何为单例模式? 顾名思义,单例模式就是保证一个类仅有一个...
    tandeneck阅读 7,321评论 1 8
  • 最近学习了Java的几种常规的设计模式,内容较多,思维方式多种多样,故将所学整理一下,写成博客,分享并加深自己的理...
    Airing阅读 4,306评论 1 10
  • 概述 单例模式是应用最广的模式之一,在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要...
    刘涤生阅读 4,669评论 0 5
  • 单例模式定义 确保某一个类之后一个实例,而且自行实例化并向整个系统提供服务。 单例模式使用场景 确保某个类有且只有...
    Android天之骄子阅读 2,806评论 0 0
  • 单例模式应该是大家最为熟知的一种设计模式了,相信大家或多或少的都在自己的项目中使用过单例模式,例如封装一个Log工...
    晨鸣code阅读 3,237评论 3 2

友情链接更多精彩内容