单例模式

单例模式的四种方式

拜拜、爱过 提交于 2020-01-20 15:28:36
单例模式的四种方式 一、内容 保证一个类只有一个实例,并提供一个访问它的全局访问点 二、角色 单利 三、使用场景 当类只有一个实例而且客户可以从一个众所周知的访问点访问它时 比如:数据库链接、Socket创建链接 四、优点 对唯一实例的受控访问 单利相当于全局变量,但防止了命名空间被污染 与单利模式功能相似的概念:全局变量、静态变量(方法) 试问?为什么用单例模式,不用全局变量呢?   答、全局变量可能会有名称空间的干扰,如果有重名的可能会被覆盖 五、单例模式的四种实现方式 1、文件导入的形式(常用) s1.py class Foo(object): def test(self): print("123") v = Foo() #v是Foo的实例 s2.py from s1 import v as v1 print(v1,id(v1)) # 35788560 from s1 import v as v2 print(v1,id(v2)) # 35788560 # 两个的内存地址是一样的 # 文件加载的时候,第一次导入后,再次导入时不会再重新加载。 2、基于类实现的单例模式 # ======================单例模式:无法支持多线程情况=============== class Singleton(object): def __init__(self): import

设计模式_创建型模式

馋奶兔 提交于 2020-01-20 12:29:44
目录 创建型模式: 简单工厂模式 工厂方法模式 抽象工厂模式 创建者模式 原型模式 单例模式 简单工厂模式 一、内容 不直接向客户端暴露对象创建的实现细节,而是通过一个工厂类来负责创建产品类的实例。 二、角色 工厂角色(Creator) 抽象产品角色(Product) 具体产品角色(Concrete Product) 三、优点 隐藏了对象创建的实现细节 客户端不需要修改代码 四、缺点 违反了单一职责原则,将创建逻辑集中到一个工厂类中 当添加新产品时,需要修改工厂类代码,违反了开放封闭原则 五、代码示例 from abc import abstractmethod,ABCMeta class Payment(metaclass=ABCMeta): @abstractmethod def pay(self,money): pass class Alipay(Payment): def pay(self, money): print('支付宝支付了%s元'%money) class Applepay(Payment): def pay(self, money): print('苹果支付了%s元' %money) class Yuebao(Payment): def pay(self,money): print('余额宝支付了%s元' %money) class

单利模式的四种方式

做~自己de王妃 提交于 2020-01-20 12:28:21
单利模式相关内容 内容 保证一个类只有一个实例,并提供一个访问它的全局访问点 角色 单利 使用场景 当类只有一个实例而且客户可以从一个众所周知的访问点访问它时 比如:数据库链接、Socket创建链接 优点 对唯一实例的受控访问 单利相当于全局变量,但防止了命名空间被污染 与单利模式功能相似的概念:全局变量、静态变量(方法)   试问?为什么用单例模式,不用全局变量呢?   答、全局变量可能会有名称空间的干扰,如果有重名的可能会被覆盖 单例模式的实现方式 1、文件导入的形式(常用) s1.py class Foo(object): def test(self): print("123") v = Foo() #v是Foo的实例 s2.py from s1 import v as v1 print(v1,id(v1)) #<s1.Foo object at 0x0000000002221710> 35788560 from s1 import v as v2 print(v1,id(v2)) #<s1.Foo object at 0x0000000002221710> 35788560 # 两个的内存地址是一样的 # 文件加载的时候,第一次导入后,再次导入时不会再重新加载。 2、基于类实现的单例模式 # ======================单例模式:无法支持多线程情况=====

设计模式之单例模式(一)

冷暖自知 提交于 2020-01-20 08:35:02
目录 一,什么是单例模式。 二,实现方式。 2.1 使用普通的方式改进 2.2 使用加锁的方式改进 2.2.1 直接加锁 2.2.2 双重检查 三, 总结 一,什么是单例模式。 举个最简单的例子,一山容不得二虎,简单地说就是一座山不能同时生活两只老虎,以此引入到oop的世界也就是一个类只能有一个实例化的对象,再多就不行了。那么什么时候会有这种需求呢?比较常见的就是数据库的连接池,线程池,windows的控制面板等,为什么同时只能实例化一个对象呢?针对前两者,无论是数据库的连接池还是线程池创建的目的就是用于公共,循环使用的有限资源,你要是同时创建多个,没能复用,不白白地浪费了资源;而对于控制面板则更好理解,要是能同时创建多个控制面板的实例,当我对不同的实例进行不同的操作,那么设置肯定会出问题的,比如一个设置让我向东,一个设置让我向西,为了避免此类情况,只能有一个控制面板的设置有效。 二,实现方式。 在Java中创建类对象是使用new关键字,要想达到阻止客户端调用时随便new对象,不难想到只要将类的构造器设为私有的,就能达成目的;但是不能new了,那么该如何获取类的对象呢?此时可以通过暴露公共的接口,然后每次返回同一个类对象即可,代码如下: public class Singleton { private Singleton(){} private static Singleton

单例模式 与 python实现

点点圈 提交于 2020-01-20 04:28:41
单例模式 单例模式就是确保一个类只有一个实例.当你希望整个系统中,某个类只有一个实例时,单例模式就派上了用场. 比如,某个服务器的配置信息存在在一个文件中,客户端通过AppConfig类来读取配置文件的信息.如果程序的运行的过程中,很多地方都会用到配置文件信息,则就需要创建很多的AppConfig实例,这样就导致内存中有很多AppConfig对象的实例,造成资源的浪费.其实这个时候AppConfig我们希望它只有一份,就可以使用单例模式. 实现单例模式的几种方法 1. 使用模块 其实,python的模块就是天然的单例模式,因为模块在第一次导入的时候,会生成.pyc文件,当第二次导入的时候,就会直接加载.pyc文件,而不是再次执行模块代码.如果我们把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了. 新建一个python模块叫singleton,然后常见以下python文件 mysingleton.py class Singleton(object): def foo(self): pass singleton = Singleton() 使用: from singleton.mysingleton import singleton 2. 使用装饰器 装饰器里面的外层变量定义一个字典,里面存放这个类的实例.当第一次创建的收,就将这个实例保存到这个字典中.

单例模式

落花浮王杯 提交于 2020-01-19 15:49:56
Java 单例模式 单例模式 非延迟加载单例类 public class Singleton {    private Singleton ( ) { }    private static final Singleton instance = new Singleton ( ) ;    public static Singleton getInstance ( ) {      return instance ;    } } 简单的同步延迟加载 public class Singleton {    private static Singleton instance = null ;    public static synchronized Singleton getInstance ( ) {      if ( instance == null )       instance = new Singleton ( ) ;      return instance ;    } } 双重检查成例延迟加载 public class Singleton {    private static volatile Singleton instance = null ;    public static Singleton getInstance ( ) {      if (

单例模式

你说的曾经没有我的故事 提交于 2020-01-18 07:46:29
首先介绍一下单例模式: 单例模式(Singleton),也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。 实现单例模式的思路是: 一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名 称);当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用;同时我们 还将该类的构造函数定义为私有方法,这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例。 需要注意的地方: 单例模式在多线程的 应用场合下必须小心使用。如果当唯一实例尚未创建时,有两个线程同时调用创建方法,那么它们同时没有检测到唯一实例的存在,从而同时各自创建了一个实例, 这样就有两个实例被构造出来,从而违反了单例模式中实例唯一的原则。 解决这个问题的办法是为指示类是否已经实例化的变量提供一个互斥锁(虽然这样会降低效率)。

单例设计模式

余生颓废 提交于 2020-01-18 02:28:38
什么是单例设计模式?  单例模式,是一种常见的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式的方法创建的类在当前进程中只有一个实例。  在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。 单例模式有以下特点: 单例类只能有一个实例 单例类必须自己创建自己的唯一实例 单例类必须给所有的其他对象提供这一实例 具体实现 需要: 将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象 在该类内部产生一个唯一的实例化对象,并且将其封装为private static类型 定义一个静态方法返回这个唯一对象 实现一:立即加载/“饿汉模式” /** * 饿汉式:在类初始化的时候,已经创建自己的实例 */ public class Singleton { //1,私有化构造方法 private Singleton(){} //2,创建自己的单例对象 private final static Singleton

单例模式

时间秒杀一切 提交于 2020-01-18 02:10:59
设计原则 1. 单一职责原则 要求一个接口或者类只有一个原因引起变化,也就是一个接口和类只有一个职责。 2. 里氏替换原则 只要父类能出现的地方子类都可以出现,而且替换为子类也不会产生任何错误或者异常。 3. 依赖倒置原则 Dependence Inversion Princple 实现类间不发生直接的依赖关系,其依赖关系通过接口或抽象类产生。 接口或抽象类不依赖于实现类。 实现类依赖接口或者抽象类。 即——“面向接口编程” 4. 接口隔离原则 接口尽量细化,接口中的方法尽量少(但是不能违反单一职责原则)。 5. 迪米特法则(最少知识原则) 一个类应该对自己需要耦合或调用的类知道的最少,即让类“羞涩”一点,尽量不要对外公布太多的public方法和非静态的public变量,多使用访问权限。 出现在成员变量、方法的输入输出参数中的类称为朋友类,而出现在方法内部的不属于朋友类。 一个类要保证只和自己的朋友类产生交流。 6. 开闭原则 一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。 设计模式 单例模式 定义 定义:Ensure a class has only one instance, and provide a global point of access to it. 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 要求一个类只能生成一个对象

单例模式

主宰稳场 提交于 2020-01-17 21:42:48
1.什么是单例模式 2.单例模式在项目中的使用 3.有哪些实现方式 实现单例模式的要点是 1 .私有化构造方法 2. 指向自己实例的私有静态引用 3.以自己实例为返回值的静态公有方法 实现方式有:延迟加载(懒汉) 与 立即加载(恶汉),区别就是是否用到时候再实例化 先来了解一下懒汉式 //懒汉式的写法 class Singleton{ //私有化构造函数 private LazySingleton(){ } //利用静态变量 private static final Singleton Singleton = new Singleton(); //对外开放一个获取对象的方法 public static Singleton getInstance(){ return Singleton; } } 静态变量在类加载的时候就构建完成,而类加载是按需加载,并且只是加载一次,类加载是现成安全的,所以上面的代码是线程安全的,并且单例。 public class Singleton { public static void main(String[] args) { // TODO Auto-generated method stub boolean flag = LazySingleton.getInstance() == LazySingleton .getInstance();