日志

《Head First 设计模式》:单件模式

 来源    2020-08-01    0  

正文

一、定义

单件模式确保一个类只有一个实例,并提供一个全局访问点。

要点:

  • 定义持有唯一单件实例的类变量。
  • 私有化构造,避免其他类产生实例。
  • 对外提供获取单件实例的静态方法。

二、实现步骤

1、创建单件类

(1)方式一:懒汉式

延迟创建单件实例。

线程不安全:

/**
 * 单件类(懒汉式、线程不安全)
 */
public class Singleton {

    /**
     * 唯一单件实例
     */
    private static Singleton uniqueInstance;
    
    /**
     * 私有构造
     */
    private Singleton() {}
    
    /**
     * 获取单件实例
     */
    public static Singleton getInstance() {
        if (uniqueInstance == null) {
            // 延迟创建单件实例
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }
}

线程安全:

/**
 * 单件类(懒汉式、线程安全)
 */
public class Singleton {

    /**
     * 唯一单件实例
     */
    private static Singleton uniqueInstance;
    
    /**
     * 私有构造
     */
    private Singleton() {}
    
    /**
     * 获取单件实例(同步方法)
     */
    public static synchronized Singleton getInstance() {
        if (uniqueInstance == null) {
            // 延迟创建单件实例
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }
}

(2)方式二:饿汉式

“急切”创建单件实例。

/**
 * 单件类(饿汉式)
 */
public class Singleton {

    /**
     * 唯一单件实例(“急切”创建单件实例)
     */
    private static Singleton uniqueInstance = new Singleton();
    
    /**
     * 私有构造
     */
    private Singleton() {}
    
    /**
     * 获取单件实例
     */
    public static Singleton getInstance() {
        return uniqueInstance;
    }
}

(3)方式三:双检锁

/**
 * 单件类(双重检查加锁)
 */
public class Singleton {

    /**
     * 唯一单件实例
     */
    private volatile static Singleton uniqueInstance;
    
    /**
     * 私有构造
     */
    private Singleton() {}
    
    /**
     * 获取单件实例
     */
    public static Singleton getInstance() {
        if (uniqueInstance == null) {
            synchronized (Singleton.class) {
                if (uniqueInstance == null) {
                    uniqueInstance = new Singleton();
                }
            }
        }
        return uniqueInstance;
    }
}

2、使用单件类获取唯一单件实例

public class Test {
    
    public static void main(String[] args) {
        // 获取单件实例
        Singleton singleton = Singleton.getInstance();
        System.out.println(singleton);
        Singleton singleton2 = Singleton.getInstance();
        System.out.println(singleton2);
    }
}
相关文章
C#设计模式——单件模式(Singleton Pattern)
日志一.概述在软件开发过程中,我们有时候需要保证一个类仅有一个实例,比如在一个电脑用户下只能运行一个outlook实例.这时就需要用到单件模式.二.单件模式单件模式保证一个类仅有一个实例,并提供一个访问它 ...
2
说说设计模式~单件模式(Singleton)
日志单件模式(Singleton)要求一个类有且仅有一个实例,并且提供了一个全局的访问点. 从概念上来研究一下它的实现,不考虑线程安全 public sealed class Singlton { sta ...
设计模式 6 —— 单件模式
日志设计模式目录: 设计模式 1 ——观察者模式 设计模式 2 —— 装饰者模式  设计模式 3 —— 迭代器和组合模式(迭代器) 设计模式 4 —— 迭代器和组合模式(组合) 设计模式 5 —— 工厂模 ...
设计模式 - 单件模式(singleton pattern) 具体解释
日志版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012515223/article/details/28595349 单件模式(singleton ...
1
设计模式之单件模式
日志今天我们来看一下单件模式,这个模式是所有模式中类图最简单的哦! 为什么用单件模式:            有些对象我们只需要一个,比如:连接池.缓存.对话框.和注册表对象.日志对           ...
1
[设计模式] javascript 之 单件模式
日志单件模式说明 1. 说明:单件模式,就是静态化的访问中已经实例化的对象,这个对象只能通过一个唯一的入口访问,已经实例或待实例化的对象:面向对象语言如Java, .Net C#这样的服务端动态语言里,能 ...
1
设计模式学习笔记(十四:单件模式)
日志1.1概述     保证一个类仅有一个实例,并提供一个访问它的全局访问点.这就是单件模式的定义.     在某些情况下,我们可能需要某个类只能创建一个对象,即不让用户用该类实例化出多于两个的实例.   ...
1
Java设计模式——线程安全的单件模式
日志单件模式,也称单例模式,用以创建独一无二的.只能有一个实例的对象. 单件模式的类图是所有模式的类图中最简单的——只有一个类.尽管从类设计的视角来看单件模式很简单,但是实现上还是会遇到一些问题,本文着重 ...
设计模式之单件模式(Singleton Pattern)
日志一.单件模式是什么? 单件模式也被称为单例模式,它的作用说白了就是为了确保“该类的实例只有一个” 单件模式经常被用来管理资源敏感的对象,比如:数据库连接对象.注册表对象.线程池对象等等,这种对象如果同 ...
1
《Head First 设计模式》之单件模式
日志单件模式(Singleton) ——确保一个类只有一个实例,并提供全局访问点. 有一些对象其实我们只需要一个,比如线程池.缓存.对话框.处理偏好设置和注册表的对象.日志对象.如果制造出多个实例,就会导 ...
1
.NET设计模式(2):单件模式(Singleton Pattern)
日志转载:https://terrylee.cnblogs.com/archive/2005/12/09/293509.html 单件模式(Singleton Pattern) --.NET设计模式系列之 ...
夜话JAVA设计模式之单例模式(单件模式Singleton)
日志单例模式也叫单件模式,就是确保一个类只有一个实例,并提供一个全局访问点.        设计成单例即把某个类设计成我们自己管理的单独实例,避免实例对象的重复创建,我们只有通过单例类的全局访问点获取实例 ...
1
JAVA设计模式之单例模式(单件模式)—Singleton Pattern
日志1.什么是单例模式? <Head First 设计模式>中给出如下定义:确保一个类只有一个实例,并提供一个全局访问点. 关键词:唯一实例对象. 2.单例模式的实现方式: 2.1 懒汉式   ...
2
设计模式:单件模式
日志Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点. 1. 单线程时方法 public sealed class Singlton { static Singlton ins ...
1
设计模式(六):Singleton 单件模式 -- 创建型模式
日志1.定义 当需要控制一个类的实例数量且调用者可以从一个公共的访问点访问时. 2.适用场景 1. 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时. 2. 当这个唯一实例应该是通过子类化可扩 ...
1
设计模式系列一创建型之(单件模式)
日志1.意图  保证一个类仅有一个实例,并提供一个访问它的全局访问点. 2.适用性 当类只有一个实例而且客户可以从一个众所周知的访问点访问它时. 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更 ...
设计模式 – 这个模式的名称是否有闭包?
问答我经常看到在我们有访问对象之前需要执行的查找代码的情况下使用的模式.使用此模式时,通常以单词with开头. 例如,在我们可以使用之前,我们需要从数据库中检索客户记录: def withCustomer ...
1
设计模式 – MVP模式(GWT)的优势是什么
问答我刚看了this article,它确实让我很困惑. Secondly, this model allows us to minimize our use of GWTTestCase, which ...
1
设计模式 – 复合模式设计问题
问答我有一个关于您在示例复合类图中常见的两个操作的问题. * GetDescendents * GetChild(int) 一个常见的例子是文件和目录,我会坚持这一点.假设感兴趣的操作是Size,因此Fi ...
1
设计模式 – Observer模式的常见错误处理机制是什么?
问答我正在学习设计模式,我注意到在Observer模式的几乎所有示例实现中都注意到在Subject的register / unregister方法中没有任何错误处理.这让我想知道如何做到这一点. 如何专门 ...
1