Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >设计模式:单例模式

设计模式:单例模式

作者头像
王强
发布于 2018-08-09 10:02:56
发布于 2018-08-09 10:02:56
33300
代码可运行
举报
文章被收录于专栏:Python爬虫实战Python爬虫实战
运行总次数:0
代码可运行

1 概述

想想一下这个场景,一个系统中可以存在多个打印任务,但是只有一个正在工作的任务。我们怎样才能保证一个类只有一个实例并且这个实例易于被访问呢?一个全局变量可以使得一个对象可以被访问,但是不能防止实例化多个对象。

一个更好的解决办法是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例被创建,并且它可以提供一个方位该实例的方法,这就是单例模式的动机。

单例模式(Singleton Pattern):单例模式确保某一个类只有一个实例,而且自行实例化并向整个 系统提供这个实例,这个类称为单例类,它提供全局访问的方法 。单例模式又名单件模式单态模式

单例模式的要点:

  • 某个类只能有一个实例
  • 它必须自行创建这个实例
  • 它必须自行向整个系统提供这个实例。

2 图解

此模式太简单,没有图。

单例模式包含如下角色:

  • Singleton:单例

3 优缺点

优点:

  • 提供了对唯一实例的受控访问。
  • 缩小命名空间。Singleton模式是对全局变量的一种改进。它避免了那些存储唯一实例的 全局变量污染名空间。
  • 由于只存在一个实例,可以节约系统资源。
  • 允许可变数量的实例。

缺点:

  • 没有抽象层,拓展会有很大困难。
  • 单例类职责过重,在一定程度上违背了“单一原则”。

4 应用场景

在以下情况下可以使用抽象工厂模式:

  • 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是重要的。
  • 系统中有多于一个的产品族,而每次只使用其中某一产品族。
  • 属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。
  • 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。

5 实例

Singleton_Uml

5.1 C++实现

  • singleton.h
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#ifndef SINGLETON_H
#define SINGLETON_H

#include <iostream>
using namespace std;

class Singleton
{
protected:
    Singleton();

public:
    static Singleton* Instance();

private:
    static Singleton* _instance;
};

#endif // SINGLETON_H
  • singleton.cpp
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "singleton.h"
#include <iostream>

using namespace std;

Singleton* Singleton::_instance = 0;

Singleton::Singleton()
{
    cout << "==> Singleton." << endl;
}

Singleton* Singleton::Instance()
{
    if (_instance == 0)
    {
        _instance = new Singleton();
    }

    return _instance;
}
  • main.cpp
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "singleton.h"
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    Singleton* singleton1 = Singleton::Instance();
    Singleton* singleton2 = Singleton::Instance();

    if (singleton1 == singleton2)
        cout << "They equal." << endl;
    return 0;
}

运行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
==> Singleton.
They equal.

代码说明:

客户仅通过 Instance() 成员函数访问这个单例。变量 _instance 初始化为0,而静态成员函数 Instance() 使用惰性初始化;它的返回值直到被第一次访问时才创建和保存。

注意构造器是保护型的。试图直接实例化 Singleton 的客户将得到一个编译时的错误信息。 这就保证了仅有一个实例可以被创建。 比如,我们使用如下代码实例化:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 Singleton* singleton = new Singleton();

编译器会报出如下错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
E:\Programming\Design Patterns\Code\C++\04_Singleton\singleton.h:10: error: 'Singleton::Singleton()' is protected
     Singleton();
     ^

5.2 Python代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#-*- coding: utf-8 -*-

'''
  单例模式
'''
class Singleton(object):
    _instance = None       

    def __new__(cls, *args, **kw):
        if not cls._instance:
            cls._instance = super(Singleton, cls).__new__(cls, *args, **kw)  
            print('==>Singleton')
        return cls._instance  

def main():
    singleton1 = Singleton()
    singleton2 = Singleton()
    print(singleton1 is singleton2)

if __name__ == '__main__':
    main()

运行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
==>Singleton
True

代码分析

在上面的代码中,我们将类的实例和一个类变量 _instance 关联起来,如果 cls._instance 为 None 则创建实例,否则直接返回 cls._instance。最后print(singleton1 is singleton2)结果为Ture,说明singleton1与singleton2为同一实例。

系列推荐阅读:

  • 设计模式:简单工厂模式
  • 设计模式:工厂方法模式
  • 设计模式:抽象工厂模式
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-04-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 C与Python实战 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java设计模式---创建型模式
本章Java设计模式的创建型模式的介绍,是通过学习视频记录的笔记,欢迎留言指出错误点
用户11010370
2024/03/12
1440
python的单例模式
所谓单例,就是保证一个类仅有一个实例。所有引用(实例、对象)拥有相同的状态(属性)和行为(方法);
py3study
2020/01/08
6950
聊聊 Python 面试最常被问到的几种设计模式(上)
在很多人的印象里,Python 作为一款动态编程语言,在日常开发中也很少涉及到设计模式
AirPython
2020/08/11
6580
设计模式 -- 常用设计模式
                                  ——可复用面向对象软件的基础
Wyc
2018/09/11
2.2K0
设计模式 -- 常用设计模式
Python设计模式:你的代码真的够优雅吗?
当涉及到代码优化时,Python作为一种高级编程语言,具有广泛的应用领域和强大的功能。在软件开发中,设计模式是一种被广泛采用的解决问题的方案,它提供了一种在特定情境中重复使用的可行方案。在Python中,有许多设计模式可以用来优化代码。
努力的小雨
2024/01/24
6000
python实现单例模式的5种方法
单例模式最初的定义出现于《设计模式》(艾迪生维斯理, 1994):“保证一个类仅有一个实例,并提供一个访问它的全局访问点。”
Tim在路上
2020/08/04
6.2K0
模版设计模式解锁:用最优方式解决最复杂问题!
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
喵手
2024/12/16
840
设计模式之单例模式(Singleton)
单例模式(Singleton Pattern)属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
海盗船长
2021/12/07
3220
设计模式之单例模式(Singleton)
设计模式之单例设计模式和抽象工厂模式
适用:单/多线程 模式:双重检查锁定(Double-Check Locking)(线程安全)[推荐] 优点:线程安全;延迟加载;效率较高(只会实例化一次,首先会判断是否实例化过,如果实例化了,直接返回实例,不需要进入lock;如果未实例化,进入lock,就算是多个调用也无妨,第一次调用的会实例化,第二个进入lock时会再次判断是否实例化,这样线程就不会阻塞了。) 缺点:基本没有
Echo_Wish
2023/11/30
1660
设计模式之单例设计模式和抽象工厂模式
一篇文章带你了解设计模式——创建者模式
下面我们来介绍第一种设计模式,创建型模式的主要关注点是怎样创建对象,它的主要特点是“将对象的创建与使用分离”。
秋落雨微凉
2023/03/08
7660
一篇文章带你了解设计模式——创建者模式
快速梳理23种常用的设计模式(上篇)
本文旨在快速梳理常用的设计模式,了解每个模式主要针对的是哪些情况以及其基础特征,每个模式前都有列举出一个或多个可以深入阅读的参考网页,以供读者详细了解其实现。
Rude3Knife的公众号
2019/08/07
5510
快速梳理23种常用的设计模式(上篇)
单例模式与全局唯一id的思考----c++ ,c ,python 实现
前段时间去考了系统架构师,排错题基本全是设计模式的内容。设计模式真的这么重要么?答案是肯定的,没有设计模式就没有现在复杂的软件系统。
流川疯
2022/05/10
8950
单例模式与全局唯一id的思考----c++ ,c ,python 实现
Python单例模式中的问题
出错的原因是“isinstance() 的第二个参数必须是一个type、type元组或union。”
每周聚焦
2025/01/14
1270
Python单例模式中的问题
Java设计模式(一)-单例模式
单例模式(Singleton Pattern) 是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
joshua317
2021/11/24
8270
Java设计模式(一)-单例模式
python设计模式-单例模式
从代码可以看出,他们加入了多种判断,以防止不好的事情发生。如果同时存在两个ChocolateBoiler实例,那这么多判断岂不是失去作用了。那我们改如何实现这个需求呢?这个问题的核心是,我们要先判断实例是不是已经存在,如果存在就不再创建。
goodspeed
2020/12/22
5490
自己平时用到的设计模式总结
作为对象的创建模式,单例模式确保其某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类。单例模式有以下特点:
小勇DW3
2018/09/29
6820
【python设计模式-创建型】单例模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
西西嘛呦
2020/08/26
3860
【python设计模式-创建型】单例模式
一、创建型设计模式介绍
概念:这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。
鸡先生
2022/10/29
3440
大牧絮叨设计模式:单例模式
单例模式(Singleton)[GOF95]是一种对象的创建模式,确保系统中使用了单例模式的类型只会存在一个实例对象,通过该对象给系统提供一致性的解决方案。
大牧莫邪
2019/07/19
4350
大牧絮叨设计模式:单例模式
十年Java”老兵“浅谈源码的七大设计模式
一个专业的程序员,总是把代码的清晰性,兼容性,可移植性放在很重要的位置。他们总是通过定义大量的宏,来增强代码的清晰度和可读性,而又不增加编译后的代码长度和代码的运行效率;他们总是在编码的同时,就考虑到了以后的代码维护和升级。甚至,只要分析百分之一的代码后,你就会深刻地体会到,什么样的代码才是一个专业的程序员写的,什么样的代码是一个业余爱好者写的。而这一点是任何没有真正分析过标准代码的人都无法体会到的。 本文会介绍一些经典的设计模式思想: Proxy代理模式 代理模式:为其他对象提供一种代理以便控制对这
Java架构
2018/05/04
7550
十年Java”老兵“浅谈源码的七大设计模式
相关推荐
Java设计模式---创建型模式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档