python设计模式之单例模式(一)
单例设计模式的概念:
单例设计模式即确保类有且只有一个特定类型的对象,并提供全局访问点。一般我们操作数据库的时候为了避免统一资源产生互相冲突,创建单例模式可以维护数据的唯一性。
单例模式的特性:
确保类有且只有一个对象被创建。
为对象提供一个访问点,以使程序可以全局访问对象。
控制共享资源的并行访问。
下面是单例模式的UML图。(注:UML-Unified Model Language 统一建模语言,又称标准建模语言。是用来对软件密集系统进行可视化建模的一种语)

传统的单例模式的实现方法是,使构造函数私有化,并创建一个静态方法来完成对象的初始化,对象在第一次调用时创建,以后这个类将返回同一个对象.
单例模式的实现
网上找了一个C#的例子(其中考虑到多线程的问题)可以了解下,下面我们主要介绍Python的单例模式的使用。
/// <summary>
/// 单例模式的实现
/// </summary>
public class Singleton
{
// 定义一个静态变量来保存类的实例
private static Singleton uniqueInstance;
// 定义一个标识确保线程同步
private static readonly object locker = new object();
// 定义私有构造函数,使外界不能创建该类实例
private Singleton()
{
}
/// <summary>
/// 定义公有方法提供一个全局访问点,同时你也可以定义公有属性来提供全局访问点
/// </summary>
/// <returns></returns>
public static Singleton GetInstance()
{
// 当第一个线程运行到这里时,此时会对locker对象 "加锁",
// 当第二个线程运行该方法时,首先检测到locker对象为"加锁"状态,该线程就会挂起等待第一个线程解锁
// lock语句运行完之后(即线程运行完之后)会对该对象"解锁"
// 双重锁定只需要一句判断就可以了
if (uniqueInstance == null)
{
lock (locker)
{
// 如果类的实例不存在则创建,否则直接返回
if (uniqueInstance == null)
{
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
在python中的使用方法就要变通了,因为python无法穿件私有的构造函数,所以下面我们来看看python是如何实现的。
class Singleton(object):
def __new__(cls):
if not hasattr(cls,'inst'):
print("no")
cls.inst=super(Singleton,cls).__new__(cls)
return cls.inst
s1=Singleton()
print(s1)
s2=Singleton()
print(s2)

下面对上面的代码进行解释,上面的代码我们重写了默认的__new__方法(python中实例化对象的方法)用来创建对象。cls表示是当前对像,hasattr是检查对象是否含有某个属性,这里是检查inst,注意这个属性的名字不要用__开头,__的作用避免子类覆盖其内容
我之前测试的时候用了__inst作为检测结果就是,每次创建对象的时候都会生成一个新的实例,可以使用一个下划线开头的词作为属性 不过一般都用instance或者缩写inst.
对象s1创建的时候 没有inst属性所以 程序给它分配了一个地址,当创建s2的时候inst已经存在所以直接把对象的地址指向了s1的了。
单例模式的用例之懒汉式实例化
一般我们在导入模块的时候,无意中会创建一个对象,但是我们有的时候根不不用他,(比如我们写一个文件 里面是selenium操作页面的 我们一般会在__init__中定义self.driver=webdriver.chrome(),我们在调用这个类的时候,就会自动弹出谷歌模拟器。)
懒汉式模式就是解决这种问题的 让我们在实际需要的时候才创建对象,所以懒汉式是比较节省资源的一种方式。
class Singleton:
__inst=None
def __init__(self):
if not Singleton.__inst:
print("开始调用init")
else:
print("__inst已经创建",self.getInstance())
@classmethod
def getInstance(cls):
if not cls.__inst:
cls.__inst=Singleton()
return cls.__inst
s= Singleton()#只是调用了init方法,但是没有新的对象创建
Singleton.getInstance()
s1= Singleton()
s2= Singleton()
s3= Singleton()
后续。。。
python设计模式之单例模式(一)的更多相关文章
- python设计模式之单例模式(一)
前言 单例模式是创建模式中比较常见和常用的模式,在程序执行的整个生命周期只存在一个实例对象. 系列文章 python设计模式之单例模式(一) python设计模式之常用创建模式总结(二) python ...
- python设计模式之单例模式(二)
上次我们简单了解了一下什么是单例模式,今天我们继续探究.上次的内容点这 python设计模式之单例模式(一) 上次们讨论的是GoF的单例设计模式,该模式是指:一个类有且只有一个对象.通常我们需要的是让 ...
- python设计模式之单例模式(转)
设计模式之单例模式 单例设计模式是怎么来的?在面向对象的程序设计中,当业务并发量非常大时,那么就会出现重复创建相同的对象,每创建一个对象就会开辟一块内存空间,而这些对象其实是一模一样的,那么有没有办法 ...
- Python设计模式之单例模式
1.由于语言的特性不同,设计模式的实现方式和实现难度也会不同 2.有的模式已经在语言内置了,比如迭代器模式. 3.单例模式可以直接用模块级变量来实现 4.普通工厂模式可以直接通过传入"类名& ...
- python设计模式之--单例模式
python的单例模式就是一个类的实例只能自始自终自能创建一次.应用场景比如说数据库的连接池. #!/usr/bin/env python # coding=utf- class Foo(object ...
- Python设计模式中单例模式的实现及在Tornado中的应用
单例模式的实现方式 将类实例绑定到类变量上 class Singleton(object): _instance = None def new(cls, *args): if not isinstan ...
- 【python 设计模式】单例模式
单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. 比如,某 ...
- python 设计模式之 单例模式
单例模式是做为"全局变量"的替代品出现的.所以它具有全局变量的特点:全局可见.贯穿应用程序的整个生命期,保证在程序执行中,某个类仅仅存在一个实例,所以通常不希望类中的构造函数被调用 ...
- python 设计模式之单例模式 Singleton Pattern
#引入 一个类被设计出来,就意味着它具有某种行为(方法),属性(成员变量).一般情况下,当我们想使用这个类时,会使用new 关键字,这时候jvm会帮我们构造一个该类的实例.这么做会比较耗费资源. 如果 ...
随机推荐
- Json-转自菜鸟教程
1. python中为什么用json有什么作用??不是python用json,json是类似xml的一种通用格式,在很多地方都可以用.json相比xml,数据量更小,而且可以很方便的和解释型语言的结构 ...
- CF484E Sign on Fence && [国家集训队]middle
CF484E Sign on Fence #include<bits/stdc++.h> #define RG register #define IL inline #define _ 1 ...
- POJ3468:A Simple Problem with Integers——题解
http://poj.org/problem?id=3468 实现一个线段树,能够做到区间修改和区间查询和. 明显板子题. #include<cstdio> #include<cma ...
- BZOJ4946 & 洛谷3826 & UOJ318:[NOI2017]蔬菜——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4946 https://www.luogu.org/problemnew/show/P3826 ht ...
- React的this.props.children
this.props用来获取组件从外部传入的属性,但是this.props.children比较特殊,它是由React给添加上的,表示组件的所有子节点.this.props.children可以用来读 ...
- 「LibreOJ NOIP Round #1」七曜圣贤
题目啰嗦:支持三个操作: 不可重复集合:1.加入一个数 2.删除一个数 3.恢复目前最早的一次删除的数 操作可能不合法,每次有效操作之后求集合的mex(最小没有出现过的数) 50组数据+1e6,必须O ...
- 【贪心】【UVA10905】 Children's Game
传送门 Description 给定n个正整数,求他们相连接后能形成的最大整数.例如:12,23这两个数能连接的最大数是2312,. Input 多组数据,每组数据中: 第一行为一个整数n 第二行有n ...
- some interesting words
No one gets rich betting against the market. Never bet against the Fed. Bulls make money, bears make ...
- 使用feign调用服务的时候注意的问题
服务端 rest api @RequestMapping(value = "/phone") public ResponsePhone getPhone(@RequestParam ...
- maven中net.sf.json报错的解决方法(转载)
原文:http://www.cnblogs.com/winner-0715/p/5928514.html 今天在用maven添加net.sf.json的jar包的时候,代码如下: <depend ...