单例模式

10、单例模式

与世无争的帅哥 提交于 2019-11-29 10:21:55
单例模式 现在有这么个需求:类每次实例化时,都会去创建一个新的类对象。如果要求不管实例化几次,都只会创建一次新的类对象,该如何实现? 答:单例模式就可以实现这个需求,好处就是可以降低内存占用率,并提高性能。可以用在一些经常被调用到的封装类,比如说读取配置文件类。 类每次实例化时,都会创建一个新的对象: class Hero4(object): pass h1 = Hero4() print(id(h1)) # 31340024 h2 = Hero4() print(id(h2)) # 31377560 单例模式的表现 单例模式的实现思路 单例模式的代码实现【面试常问】 实现单例模式(最简单的单例模式) class Hero(object): “”“单例模式类”"" __flag = False # 判断类是否创建过对象 __cls = None # 用于存储创建的对象 def __new__(cls, *args, **kwargs): if not cls.__flag: # 如果没有创建过对象 cls.__cls = super().__new__(cls) # 父类方法创建个对象,并存储起来 cls.__flag = True # 修改判断属性 return cls.__cls # 返回创建好的对象 else: # 如果已经创建过对象 return cls.__cls #

进击的单例模式

那年仲夏 提交于 2019-11-29 10:06:45
一:幼年体(只适用于单线程) 1.设置单例 public class Singleton { private static Singleton _Singleton = null; public static Singleton CreateInstance() { if (_Singleton == null) { _Singleton = new Singleton(); Console.WriteLine("单例已被创建"); } return _Singleton; } } 2.使用单例 static void Main(string[] args) { TaskFactory taskFactory = new TaskFactory(); List<Task> taskList = new List<Task>(); for (int i = 0; i < 5; i++) { //当多个线程同时判断单例对象为空,那么这个对象将会被创建了几次,因此单例失去了意义 taskList.Add(taskFactory.StartNew(()=> { Singleton s = Singleton.CreateIntance(); })); } Console.ReadKey(); } 二:完全体(可适用于多线程) 设置单例时加一把锁,禁止多个线程同时访问该对象资源 public

聊一聊最难的设计模式 - 单例模式

陌路散爱 提交于 2019-11-29 09:40:55
很多人上来肯定一脸懵逼,因为在你的印象中,单例模式实现起来还是很简单的。不要着急,慢慢往下看,你就知道为什么我说它最难了。 1. 基本概念 单例模式是一种常用的创建型设计模式。单例模式保证类仅有一个实例,并提供一个全局访问点。 2. 适用场景 想确保任何情况下都绝对只有一个实例。 典型的场景有:windows 的任务管理器、windows 的回收站、线程池的设计等。 3. 单例模式的优缺点 优点 内存中只有一个实例,减少了内存开销。 可以避免对资源的多重占用。 设置全局访问点,严格控制访问。 缺点 没有接口,扩展困难。 4. 常见的实现模式 懒汉式 饿汉式 5. 先搞一个懒汉式的玩一玩 public class LazySingleton { // 1. 私有对象 private static LazySingleton lazySingleton = null; // 2. 构造方法私有化 private LazySingleton() {} // 3. 设置全局访问点 public static LazySingleton getInstance() { if (lazySingleton == null) { lazySingleton = new LazySingleton(); } return lazySingleton; } } 接下来,我们单线程测试 public

wpf 单例模式和异常处理 (原发布 csdn 2017-04-12 20:34:12)

别来无恙 提交于 2019-11-29 07:28:36
第一次写博客,如有错误,请大家及时告知,本人立即改之。 如果您有好的想法或者建议,我随时与我联系。 如果发现代码有误导时,请与我联系,我立即改之。 好了不多说,直接贴代码。 一般的错误,使用下面三个就可以了。我不太赞同项目里面大量使用try{}catch{}(释放资源除外) // 设置UI线程发生异常时处理函数 System.Windows.Application.Current.DispatcherUnhandledException += App_DispatcherUnhandledException; // 设置非UI线程发生异常时处理函数 AppDomain.CurrentDomain.UnhandledException += App_CurrentDomainUnhandledException; // 设置托管代码异步线程发生异常时处理函数 TaskScheduler.UnobservedTaskException += EventHandler_UnobservedTaskException; 特殊情况下,此函数可检测到c++封装的dll(不是百分之百可以检测到) public delegate int CallBack(ref long a); CallBack myCall; [DllImport("kernel32")] private static

单例模式

一曲冷凌霜 提交于 2019-11-29 06:30:50
单例模式 整个过程中只有一个实例,所有生成的实例都指向同一块内存空间 实现单例的第一种方法(通过类的绑定方法) #当用户输入端口和地址,实例化产生新对象 #当用户不输入端口和地址,每次拿到的对象,都是同一个 class Sql(): isinstance=None def __init__(self,port,host): self.port=port self.host=host @classmethod def get_num(cls): import setting if not cls.instance: cls.instance=cls(setting.PORT,setting.HOST) return cls.instance #m每次调用get_num 拿到的对象都是同一个 s1=Sql.get_num() s2=Sql.get_num() print(s1) print(s2) s3=Sql('33066','8.8.8.8') print(s3) <__main__.Sql object at 0x0000027E22BE6C18> <__main__.Sql object at 0x0000027E22BE6C18> <__main__.Sql object at 0x0000027E22BE6BE0> #setting文件 PORT=3306 HOST=

单例模式以及四种实现方法

故事扮演 提交于 2019-11-29 06:21:14
目录 单例模式 一、什么是单例模式 二、实现单例模式的四种方法 2.1 定义一个类方法实现单例模式 2.2 定义一个装饰器实现单例模式 2.3 定义一个元类实现单例模式 2.4 通过模块导入实现单例模式(python的模块是天然的单例) 单例模式 一、什么是单例模式 类的设计模式有23种 单例模式是其中一种设计模式 单例模式: 即单个实例,指的是同一个类实例化多次的结果都指向同一个对象,可以用于节省内存空间 二、实现单例模式的四种方法 举例:当用户输入端口和地址,实例化产生新对象 ​ 当用户不输入端口和地址,每次拿到的对象都是同一个 需要创建一个settings文件配置端口和地址数据 2.1 定义一个类方法实现单例模式 class Sql(): _instance = None def __init__(self,post,host): self.post = post self.host = host # @classmethod # def get_sigoleton(cls): # import settings # if cls._instance: # return cls._instance # else: # cls._instance=cls(settings.PORT,settings.HOST) # return cls._instance #

单列模式简单介绍

寵の児 提交于 2019-11-29 05:48:50
/** 单例模式: New User(); 将一个类的构造方法设置为私有的,然后对外提供一个公共的可以调用该类的私有构造方法的接口方法 只允许被实例化出来一个对象,即在内存只存在一个类的对象,就叫做单例模式 应用场景: 如window系统的任务管理器、服务等窗口界面、聊天窗口等都采用了单例模式。 */ // 1.饿汉模式 类加载的时候,就将该类的对象实例化出来,(占用资源) 用户使用时 直接调用。 public class HungryDemo{ // private HungryDemo(){ } //static 修饰的变量,就是全局变量,在内存只会存在一个改变量的对象。 private static HungryDemo hungry = new HungryDemo(); //提供对外部的访问方法。 public static HungryDemo getInstance(){ return hungry; } } /* 一、懒汉模式: 懒汉式 的单例模式的实现: 就是在类加载的时候,没有实例化该类的对象, 特点:节省内存的空间 , 效率相对较低。 */ public class StarvingDemo{ private StarvingDemo(){ } // 先给他一个空值 private static StarvingDemo s=null; public

golang单例模式

↘锁芯ラ 提交于 2019-11-29 04:49:44
1、定义:单例对象的类必须保证只有一个实例存在,全局有唯一接口访问。 2、分类:   懒汉方式:指全局的单例实例在第一次被使用时构建。 饿汉方式:指全局的单例实例在类装载时构建。 3、实现: (1)懒汉方式   1 type singleton struct{} 2 var ins *singleton 3 func GetIns() *singleton{ 4 if ins == nil { 5   ins = &singleton{} 6 } 7 return ins 8 }   缺点:非线程安全。当正在创建时,有线程来访问此时ins = nil就会再创建,单例类就会有多个实例了。 (2)饿汉方式    1 type singleton struct{} 2 var ins *singleton = &singleton{} 3 func GetIns() *singleton{ 4 return ins 5 }   缺点:如果singleton创建初始化比较复杂耗时时,加载时间会延长。 (3)懒汉加锁    1 type singleton struct{} 2 var ins *singleton 3 var mu sync.Mutex 4 func GetIns() *singleton{ 5 mu.Lock() 6 defer mu.Unlock() 7 8 if

你真的会用单例模式?

戏子无情 提交于 2019-11-29 03:34:51
单例模式可以说只要是一个合格的开发都会写,但是如果要深究,小小的单例模式可以牵扯到很多东西,比如:多线程是否安全?是否懒加载?性能等等。还有你知道几种单例模式的写法呢?如何防止反射破坏单例模式? 一、 单例模式 1.1 定义 单例模式就是在程序运行中只实例化一次,创建一个全局唯一对象。有点像 Java 的静态变量,但是单例模式要优于静态变量: 静态变量在程序启动的时候 JVM 就会进行加载,如果不使用,会造成大量的资源浪费; 单例模式能够实现懒加载,能够在使用实例的时候才去创建实例。 开发工具类库中的很多工具类都应用了单例模式,比例线程池、缓存、日志对象等,它们都只需要创建一个对象,如果创建多份实例,可能会带来不可预知的问题,比如资源的浪费、结果处理不一致等问题。 1.2 单例的实现思路 静态化实例对象; 私有化构造方法,禁止通过构造方法创建实例; 提供一个公共的静态方法,用来返回唯一实例。 1.3 单例的好处 只有一个对象,内存开支少、性能好; 避免对资源的多重占用; 在系统设置全局访问点,优化和共享资源访问。 二、 单例模式的实现 饿汉模式 懒汉模式 双重检查锁模式 静态内部类单例模式 枚举类实现单例模式 2.1 饿汉模式 在定义静态属性时,直接实例化了对象 public class HungryMode { /** * 利用静态变量来存储唯一实例 */ private

Python—程序设计:单例模式

笑着哭i 提交于 2019-11-29 03:22:27
单例模式   单例模式(Singleton Pattern)属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建,并提供一种访问其唯一对象的方式。 特点:   1.单例类只能有一个实例   2.单利类必须自己创建自己的唯一实例   3.单例类必须给其他对象提供这一实例 解决问题:   一个全局使用的类,频繁的创建于销毁。 使用场景:   需要控制实例数目,节省系统资源的时候。 创建方法:   判断单例类当前是否存在实例,如果有则返回这个实例,没有就创建 实际用法:   1.创建一个对象需要消耗过多的资源,比如I/O与数据库连接等   2.Web中的计数器,不用每次刷新都在数据库里加一次,先用单利缓存起来   3.线程池的设计一般也才有单例模式,方便线程控制   4.应用程序的日志应用,一般都何用单例模式实现,由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。 代码实现: 1.使用模块 # 1.使用模块: """Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件, 当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。 因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。""" class