单例模式

Python中的单例模式

为君一笑 提交于 2020-04-02 06:24:59
在 Python 中,我们可以用多种方法来实现单例模式: 使用模块 使用 __new__ 使用装饰器(decorator) 使用元类(metaclass) # mysingleton.py class My_Singleton(object): def foo(self): pass my_singleton = My_Singleton() ##############调用 from mysingleton import my_singleton my_singleton.foo() 使用 __new__ 为了使类只能出现一个实例,我们可以使用 __new__ 来控制实例的创建过程 class Singleton(object): _instance = None def __new__(cls, *args, **kwargs): if not cls._instance: cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs) return cls._instance class MyClass(Singleton): c = 1 a=MyClass() b=MyClass() print(a==b) print(a is b) print(id(a),id(b)) """ True True

单例模式

十年热恋 提交于 2020-04-01 07:56:29
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 注意: 1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例。 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 主要解决: 一个全局使用的类频繁地创建与销毁。 何时使用: 当您想控制实例数目,节省系统资源的时候。 如何解决: 判断系统是否已经有这个单例,如果有则返回,如果没有则创建。 关键代码: 构造函数是私有的。 应用实例: 1、一个党只能有一个书记。 2、Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。 3、一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。 优点: 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。 2、避免对资源的多重占用(比如写文件操作)。 缺点: 没有接口,不能继承

单例模式

三世轮回 提交于 2020-04-01 02:45:51
概念 单例模式是一种常用的软件设计模式,单例模式给出了一种特有的定义,即在程序运行中某个类的实例是保持不变的。她的意义主要是在程序运行中对一些特有的数据做一些基础的构建,比如整个系统的底层数据支持,这种就可以通过单例模式来实现。下面介绍一下她在python中的几种实现方式。 装饰器方式 这种实现方式是将单例封装在一个装饰器中,然后使用的时候直接装饰她即可。 def Singleton(cls): _instance = {} def _singleton(*args, **kwargs): if cls not in _instance: _instance[cls] = cls(*args, **kwargs) return _instance[cls] return _singleton @Singleton class Myclass: pass 使用类方法 python在实例化对象时首先会先执行__new__,再执行__init__方法,所以我们还可以这么写 class Singleton(object): def __new__(cls, *args, **kwargs): if not hasattr(Singleton, "_instance"): if not hasattr(Singleton, "_instance"): Singleton._instance

饿汉模式单例模板

老子叫甜甜 提交于 2020-03-30 19:37:22
使用c11的std::call_once实现饿汉模式的单例模板 #ifndef SINGLETON_H #define SINGLETON_H #include <memory> #include <mutex> //单例模板 template <typename T> class Singleton { public: static T& GetInstance(); private: static std::unique_ptr<T> instance; }; template <typename T> std::unique_ptr<T> Singleton<T>::instance; template <typename T> T& Singleton<T>::GetInstance() { std::once_flag sflag; std::call_once(sflag, [&](){ instance.reset(new T()); }); return *instance; } #define SINGLETON(Class) \ public: \ ~Class() = default; \ private: \ Class() = default; \ Class(const Class &other) = delete; \ Class& operator=

Java学习升阶 -02-单例模式设计分析

半世苍凉 提交于 2020-03-29 14:01:32
单例模式定义 单例模式(Singleton),也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。 单例模式的作用 许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为方便管理,也使系统资源占用率大大降低,也可以提高公共资源载入速度。 应用场景 比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。需要频繁的进行创建和销毁的对象;创建对象时耗时过多或耗费资源过多,但又经常用到的对象;频繁访问数据库或文件的对象。那么可以初步归纳一下应用场景: 公用静态资源类 如前端中模版页、图片链接等等 全局信息类 全局计数、环境变量、系统基本配置等 无状态工具类 日志工具、字符串工具、文件处理、图片上传等 单例模式的实现方法 饿汉式 public class Singleton { private final static Singleton INSTANCE = new Singleton(); private Singleton(){} public static Singleton getInstance(){ return INSTANCE; } } 同静态代码块方式: public

设计模式之单例模式详解及代码示例

喜你入骨 提交于 2020-03-29 04:20:35
一、什么是单例模式   单例模式的定义就是确保某一个类只有一个实例,并且提供一个全局访问点。属于设计模式三大类中的 创建型模式 。单例模式具有典型的三个特点 单例类只有一个实例对象; 该单例对象必须由单例类自行创建; 单例类对外提供一个访问该单例的全局访问点;   类图如下:                单例模式优缺点 优点 :由于单例模式只生成了一个实例,所以能够节约系统资源,减少性能开销,提高系统效率,同时也能够严格控制客户对它的访问。 缺点 :也正是因为系统中只有一个实例,这样就导致了单例类的职责过重,违背了“单一职责原则”,同时也没有抽象类,这样扩展起来有一定的困难。 二、如何实现单例模式   常见的单例模式实现方式有五种: 饿汉式 、 懒汉式 、 双重检测锁式 、 静态内部类式 和 枚举单例 。而在这五种方式中 饿汉式 和 懒汉式 又最为常见。   1、饿汉式   饿汉式写法是线程安全的,调用效率高。但是不能延时加载。代码如下: public class SingletonDemo1 { //线程安全的 //类初始化时,立即加载这个对象 private static SingletonDemo1 instance = new SingletonDemo1(); private SingletonDemo1() { } //方法没有加同步块,所以它效率高 public

创建模式之单例模式

好久不见. 提交于 2020-03-28 10:50:33
PPT视频讲解链接: https://v.youku.com/v_show/id_XNDYwODU0Njg2NA==.html 1、单例模式的使用动机   在软件系统中,jingc 有这样一些特殊类,必须保证他们在系统中值存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。   保证一个实例应该是设计者(类本身)的责任,而不是使用者(客户终端)的责任 2、单例模式的定义及适用范围   定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。   适用:当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时    注意: 1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例   类图:      例子代码:    class Singleton { private static Singleton instance = null; // 防止被外部实例化 private Singleton() { } public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } public class TestSingleton { public test(){

单例模式的 8 种写法,整理非常全!

自作多情 提交于 2020-03-27 09:40:20
概念 单例模式即一个 JVM 内存中只存在一个类的对象实例。 分类 1、懒汉式 类加载的时候就创建实例 2、饿汉式 使用的时候才创建实例 当然还有其他的生成单例的方式,双重校验锁,枚举和静态内部类,文中会有介绍。 懒汉式 1) 示例1 public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 线程不安全,不可用。 2) 示例2 public class Singleton { private static Singleton instance; private Singleton (){} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 同步方法,线程安全,效率低,不推荐。 3) 示例3 public class Singleton {

单例模式的 8 种写法,整理非常全!

本秂侑毒 提交于 2020-03-27 09:08:48
3 月,跳不动了?>>> 概念 单例模式即一个 JVM 内存中只存在一个类的对象实例。 分类 1、懒汉式 类加载的时候就创建实例 2、饿汉式 使用的时候才创建实例 当然还有其他的生成单例的方式,双重校验锁,枚举和静态内部类,文中会有介绍。 懒汉式 1) 示例1 public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 线程不安全,不可用。 2) 示例2 public class Singleton { private static Singleton instance; private Singleton (){} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 同步方法,线程安全,效率低,不推荐。 3) 示例3 public class

设计模式之单例模式

随声附和 提交于 2020-03-25 17:09:02
单例模式类图是23种设计模式类图中最简单的,因为它的类图上只有一个类! 什么时候会用到单例模式呢? 有一些对象我们只需要一个,比如说:线程池(ThreadPool)、缓存(cache)、日志对象、充当打印机设备的驱动程序的对象等等,如果创造出多个实例,就会出现程序行为异常或者与结果不一致的现象。 如何创造出独一无二的对象实例呢? 我们都知道:如果我有一个类NewObject(), 我想创建这个类的对象,怎么做?--------new NewObject()就可以了; 是不是可以无限创建呢? --------如果它是公开类就可以; 如果它的构造函数是私有的呢? -------那别的类就不可以实例化它了(调用不了它的构造函数); 那谁来实例化它呢? --------只能它自己进行实例化了; 那我怎么使用它呢? --------通过get方法暴露出来; 那么: public class NewObject{ //声明静态变量类 private static NewObject newObject; //构造函数私有化 private NewObject(); //get方法暴露出去以便其他类调用 public static NewObject getInstance(){ //判断变量类是否已经实例化 //如果newObject引用为null,表示还没有创建实例