单例模式

单例模式

和自甴很熟 提交于 2019-11-29 19:20:27
一、什么是单例模式 整个过程中只有一个实例,所有生成的实例都指向同一块内存空间,本质是为了节省空间 class Person: def __init__(self, name, age): self.name = name self.age = age p1 = Person('yjy',18) p2 = Person('yjy',18) print(p1) #<__main__.Person object at 0x000002694B07E278> print(p2) #<__main__.Person object at 0x000002694B07E2B0> 以上p1和p2的内存空间不一样,就不是单例模式 二、实现单例模式的方法 需求: 当用户输入端口和地址,实例化产生新对象 当用户不输入端口和地址,每次拿到的对象,都是同一个 2.1 通过类的绑定方法 class Sql(): #定义一个Sql类 _instance = None #定义一个初始变量__instance=None,将第一次实例的对象传给他,有每次外面再访问就直接进行get_singleton里面的if判断 def __init__(self,port,host): self.port = port self.host = host @classmethod #运用类的绑定方法 绑定给Sql类去直接调用实例化

C++单例模式

拜拜、爱过 提交于 2019-11-29 19:16:41
C++单例模式 单例类,顾名思义就是类对象实例唯一,不会被重复多次构造。 划重点 1、构造函数私有化,防止外部调用构造类的实例; 2、提供一个静态私有对象,用于访问自身; 3、提供一个 static public 函数,用于创建或获取其本身的静态私有对象; 4、涉及到多线程时,线程安全问题; 5、资源释放。 懒汉式 and 饿汉式 懒汉式 // singleton.h #ifndef SINGLETON_H #define SINGLETON_H #include < QMutex > // 单例 - 懒汉式/饿汉式公用 class Singleton { public : static Singleton * GetInstance ( ) ; private : Singleton ( ) { } // 构造函数(被保护) Singleton ( Singleton const & ) ; // 无需实现 Singleton & operator = ( const Singleton & ) ; // 无需实现 private : static Singleton * m_pSingleton ; // 指向单例对象的指针 static QMutex m_mutex ; // 锁 } ; #endif // SINGLETON_H // singleton.cpp

Python 单例模式

心已入冬 提交于 2019-11-29 19:11:30
目录 单例模式 什么是单例模式 单例模式 什么是单例模式 多次实例化指向的都是同一块内存地址,拿到的都是同一个对象 节约空间 单例模式一 #通过类方法第一种方法 # class Sql(): # _instance=None # def __init__(self,port,host): # self.port=port # self.host=host # @classmethod # def get_sigoleton(cls): # import settings # if not cls._instance: # cls._instance = cls(settings.PORT, settings.HOST) # return cls._instance # # #每次调用get_sigoleton 拿到的对象都是同一个 # s1=Sql.get_sigoleton() # s2=Sql.get_sigoleton() # s3=Sql.get_sigoleton() 单例模式二 #通过装饰器:第二种方式 # def get_sigoleton(cls): # #cls就是Sql这个类 # import settings # _instance=cls(settings.PORT, settings.HOST) # # _instance=Sql(settings

PHP单例模式 要点

爷,独闯天下 提交于 2019-11-29 17:21:46
三私一公: 私有的静态属性; 私有的构造方法; 私有的克隆方法; 公有的静态方法。 问题1: 什么是单例模式? 答: 作为对象的创建模式,单例模式确保了某一个类只有一个实例,并且对外提供这个全局实例的访问入口。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。 问题2: PHP单例模式三要素是什么? 答: 1. 需要一个保存类的唯一实例的静态成员变量。 2. 构造函数和克隆函数必须声明为私有,防止外部程序创建或克隆。 3. 必须提供一个访问这个实例的公共静态方法,从而返回唯一实例的一个引用。 问题3: 为什么要使用单例模式?(单例模式的优点有哪些?) 答: 使用单例模式的好处有很多,以数据库操作为例。若不采用单例模式,当程序中出现大量数据库操作时,每次倒要执行实例化操作; 每次都会消耗大量的内存资源和系统资源,而且每次打开和关闭数据库连接都是对数据库的一种极大的浪费。但如果使用单例模式,只需要实例化一次,不需要每次都执行new操作,极大降低了资源的消耗。 问题4: 为什么必须是静态? 答: 因为静态成员属于类,并被类所有实例所共享。 问题5: 为什么必须是私有? 答: 不允许外部直接访问,仅允许通过类方法控制方法访问。 来源: https://www.cnblogs.com/qiqiyo/p/11524194.html

java单例模式笔记

感情迁移 提交于 2019-11-29 17:08:54
饿汉式 public class Singleton { //创建静态私有构造方法 private Singleton() { super(); } //创建该类型的私有静态实例 private static Singleton instance = new Singleton(); //创建公有静态方法,返回私有静态实例 public Singleton getInstance(){ return instance; } } 来源: https://blog.csdn.net/qq_29478763/article/details/100862438

单例模式(一)

南笙酒味 提交于 2019-11-29 15:07:56
5中创建单例模式的方法 ①.饿汉式 /** * @author json.yang * @Description 饿汉式单例模式 初始化的时候进行加载 * @Date 2019/9/8 */ public class SingtonDemo1 { //类初始话的时候进行加载,(没有懒加载的优势)天然的是线程安全的 private static SingtonDemo1 instance = new SingtonDemo1(); private SingtonDemo1(){ } //方法没有同步,调用效率高 public static SingtonDemo1 getInstance(){ return instance; } } ②.懒汉式 /** * @author json.yang * @Description 懒汉式单例模式 真正使用的收进行加载,有延迟加载的优势 * @Date 2019/9/8 */ public class SingtonDemo2 { private static SingtonDemo2 instance; private SingtonDemo2(){ } //多线程情况下,会触发线程安全问题,因此方法需要同步 public static synchronized SingtonDemo2 getInstance(){ if(instance

设计模式—创建型模式

不问归期 提交于 2019-11-29 15:04:57
文章目录 创建型模式 1、工厂模式 1.1、简单工厂模式 1.2、工厂方法模式 1.3、抽象工厂模式 2、单例模式 2.1、懒汉单例模式 2.1.1、非线程安全的懒汉单例模式 2.1.2、线程安全的懒汉单例模式 2.1.3、返回一个reference指向local static对象(非线程安全) 2.2、饿汉单例模式 3、建造者模式 4、原型模式 创建型模式 创建型模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。 优点:程序在判断针对某个给定实例需要创建哪些对象时更加灵活。 1、工厂模式 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。工厂模式作为一种创建模式,一般在创建复杂对象时,考虑使用;在创建简单对象时,建议直接new完成一个实例对象的创建。 1.1、简单工厂模式 主要特点是需要在工厂类中做判断,从而创造相应的产品,当增加新产品时,需要修改工厂类。使用简单工厂模式,我们只需要知道具体的产品型号就可以创建一个产品。 缺点:工厂类集中了所有产品类的创建逻辑,如果产品量较大,会使得 工厂类变的非常臃肿 。 /* 1、创建一个 Shape 接口和实现 Shape 接口的实体类。 2、定义工厂类 ShapeFactory。 3、使用 ShapeFactory 来获取 Shape 对象

单例模式

核能气质少年 提交于 2019-11-29 13:28:39
对象的创建模式! 什么叫单例模式? 单例模式确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例 单例模式满足三个特点: 1、单例类只能有 一个实例 2、单例类必须自己创建自己的唯一实例 (构造器私有,避免外部实例化) 3、单例类必须给其它对象 提供这唯一的实例 。 饿汉式与懒汉式 1、饿汉式 单例类中提供一个私有的静态类变量,构造器私有, 加载类时完成实例化 ;并提供一个静态工厂方法供外部获取实例; 2、懒汉式 单例类中提供一个私有的静态变量,构造器私有,在静态工厂方法被 第一次调用时实现实例化。 懒汉式的线程安全问题(双重检查实例) 懒汉式在多线程情况下,当两个线程同时出现在if(obj == null)的判断检查时,会有两个以上的实例被创建出来。 1、加锁 在懒汉式的获取单例对象的静态工厂方法上加锁(synchronized),保证整个方法是同步的; 2、双重检查 由于出现线程安全问题只会在创建实例时出现,所以锁可以从锁整个方法优化为锁单个代码块(当对象未创建时,第一次实例化对象的代码块); 问题来了 由于java编译器的优化,导致Object obj = new Object();会发生先将内存地址分配给obj,后初始化obj实例的情况( 即指令重排序 )。 解决办法 obj对象使用关键字volatile修饰,可以禁止指令重排序。 3、静态内部类

javascript 单例模式

最后都变了- 提交于 2019-11-29 12:32:09
一、单例模式例子 var instantiated; var Singleton = function () { var name = "fengshu"; function init() { return { publicMethod: function () { console.log('hello world'); }, test: 1 }; } if (!instantiated) { instantiated = init(); } return instantiated; }; //undefined 方法里面的变量为局部变量,只能在方法内部使用 console.log(Singleton.name); var single = new Singleton(); console.log(single.test) var single2 = new Singleton(); //true 单例 console.log(single === single2); 二、javascript中的共有属性、共有方法、私有属性私有方法 var Person=function () { //公有属性 this.name="fengshu"; //私有属性 var age = 23; //私有方法 var calAge=function(){ return this.age; } /

四种单例模式

早过忘川 提交于 2019-11-29 10:26:13
设计模式 23种设计模式 单例模式: 整个过程中只有一个实例,所有生成的实例都指向同一块内存空间 # settings PORT=3306 HOST='127.0.0.1' class Person(): def __init__(self,name,age): self.name=name self.age=age p1=Person('lqz',19) p2=Person('nick',18) print(p1) print(p2) 实现单利的第一种方法(通过类的绑定方法) 当用户输入端口和地址,实例化产生新对象 当用户不输入端口和地址,每次拿到的对象,都是同一个 class Sql(): _instance=None def __init__(self,port,host): self.port=port self.host=host @classmethod def get_sigoleton(cls): import settings if not cls._instance: cls._instance = cls(settings.PORT, settings.HOST) return cls._instance s1=Sql.get_sigoleton() s2=Sql.get_sigoleton() s3=Sql.get_sigoleton() print(s1)