Python设计模式之一(单例模式)
单例模式就是告诉你,只有一个对象
(1)单例模式不适用的场景
#单例模式就是告诉你,其实只有一个对象
class Person:
def __init__(self,name,age):
self.name = name
self.age = age '''
假设这样一个场景,有一个专门创造人的这样一个类,在我们每实例化创造一个人的时候,
我们要赋予这个人姓名,年龄,基本,身高,等等,这种模式明显不适用单例模式,因为有多个对象,
且每个对象都封装了不同属性,单例模式则只能允许创建一个人,所以不适用
'''
xiaoming=Person('小明',18)
xiaoyue =Person('小月',19)
xiaohong = Person('小红',28)
(2)当所有实例中封装的数据相同时,就可以使用单例模式,例如
class Person2:
def __init__(self):
self.name = 'jay'
self.age = 33
def f1(self):
pass
def f2(self):
pass xiaoming =Person2()
xiaoming.f1()
'''创建了两个相同的实例,浪费内存,这种情景可以使用单例模式了'''
xiaoming = Person2()
xiaoming.f1()
还有一个经典的使用场景,机器之间数据库的链接
下面对这种单例模式进行探讨,假设创建一个连接池
import random
class ConnectionPool:
def __init__(self):#链接数据库需要的通行证
self.ip= '2.2.2.2'
self.port= 6379
self.pwd = '654321'
self.username = 'jay'
#去链接
self.conn_list = [1,2,3,4,5,6]#假设创建了6个链接
def get_connection(self):
#获取链接,这里具体每写,只是个例子
r = random.randrange(1,6)
return r pool=ConnectionPool()
for i in range(6):
conn = pool.get_connection()#进行链接,每次链接的时候进去拿一个连接就好了,不用再实例化一个对象
这样个人每次在操作的时候都是一个单例模式,用一个实例进行链接,但是如果多个人同事打开这个文件,还是会实例化多个同样的对象,浪费内存
我们可以这样操作,使在内存里面每次调用的时候都似乎获取到第一次创建的实例
import random
class ConnectionPool:
__instance = None#默认是None
def __init__(self):#链接数据库需要的通行证
self.ip= '2.2.2.2'
self.port= 6379
self.pwd = '654321'
self.username = 'jay'
#去链接
self.conn_list = [1,2,3,4,5,6]#假设创建了6个链接
@staticmethod
def get_instance():
if ConnectionPool.__instance:#如果实例已经存在,则直接返回创建过的实例
return ConnectionPool.__instance
else:
ConnectionPool.__instance =ConnectionPool()#如果是第一次调用,执行该函数,实例化一个连接池
return ConnectionPool.__instance#将对象赋值给静态字段
def get_connection(self):
#获取链接
r = random.randrange(1,6)
return r obj1= ConnectionPool.get_instance()
print(obj1)
obj2= ConnectionPool.get_instance()
print(obj2)
obj3= ConnectionPool.get_instance()
print(obj3)
obj4= ConnectionPool.get_instance()
print(obj4)
结果如图
(3)创建web站点的单例模式
这里是用简单的Python代码写一个网站
from wsgiref.simple_server import make_server def index():
return 'index'
def news():
return 'nnnnnnn'
def RunSever(environ,start_response):
start_response(status='200 ok',headers=[('Content-Type','text/html')])
url=environ['PATH_INFO']#这是用户访问的url
#这里我们访问http://127.0.0.1:8000/ if url.endswith('index'):#根据网页以什么什么结尾则决定调用的函数
return index() elif url.endswith('news'):
return news()
else:
return '404'
'''
这里表示的是当我们访问http://127.0.0.1:8000/index,则返回index函数的执行结果,其他同理
这里相当于搞了个网站
''' if __name__ == '__main__': httpd= make_server('',8000,RunSever)#相当于启动一个网站,8000在这里表示端口
print('Server HTTP on port 8008...')
httpd.serve_forever()#一直监听该端口,内部有个while循环,等待别人访问
当我们执行的时候,浏览器打开这个这个网站,则会根据条件返回相关数据,结果如图
只要有人来请求了,则会在内存里面执行一次RunSever函数,给请求人结果,
当我们把上面那个ConnectionPool类的代码加进这个web站点里面,可以使用单例模式,使访问的用户每次只调用同一个实例
from wsgiref.simple_server import make_server
import random class ConnectionPool:
__instance = None#默认是None
def __init__(self):#链接数据库需要的通行证
self.ip= '2.2.2.2'
self.port= 6379
self.pwd = '654321'
self.username = 'jay'
#去链接
self.conn_list = [1,2,3,4,5,6]#假设创建了6个链接
@staticmethod
def get_instance():
if ConnectionPool.__instance:#如果实例已经存在,则直接返回创建过的实例
return ConnectionPool.__instance
else:
ConnectionPool.__instance =ConnectionPool()#如果是第一次调用,执行该函数,实例化一个连接池
return ConnectionPool.__instance#将对象赋值给静态字段
def get_connection(self):
#获取链接
r = random.randrange(1,6)
return r def index():
p = ConnectionPool.get_instance()
print(p) # 这里使每次用户访问的时候都调用同一个类,节约内存,之后则可以调用ConnectionPool的方法,例如选取链接
return 'index'
def news():
return 'nnnnnnn'
def RunSever(environ,start_response):
start_response(status='200 ok',headers=[('Content-Type','text/html')])
url=environ['PATH_INFO']#这是用户访问的url
#这里我们访问http://127.0.0.1:8000 if url.endswith('index'):#根据网页以什么什么结尾则决定调用的函数
return index() elif url.endswith('news'):
return news()
else:
return '404'
'''
这里表示的是当我们访问http://127.0.0.1:8000/index,则返回index函数的执行结果,其他同理
这里相当于搞了个网站
''' if __name__ == '__main__': httpd= make_server('',8000,RunSever)#相当于启动一个网站,8000在这里表示端口
print('Server HTTP on port 8008...')
httpd.serve_forever()#一直监听该端口,内部有个while循环,等待别人访问
这样,每次就算不同的人访问该页面,都是调用同一个类的方法,可以节约服务器内存
结果如图,都是同一个内存
Python设计模式之一(单例模式)的更多相关文章
- python设计模式之单例模式(一)
前言 单例模式是创建模式中比较常见和常用的模式,在程序执行的整个生命周期只存在一个实例对象. 系列文章 python设计模式之单例模式(一) python设计模式之常用创建模式总结(二) python ...
- python设计模式之单例模式(二)
上次我们简单了解了一下什么是单例模式,今天我们继续探究.上次的内容点这 python设计模式之单例模式(一) 上次们讨论的是GoF的单例设计模式,该模式是指:一个类有且只有一个对象.通常我们需要的是让 ...
- python设计模式之单例模式(转)
设计模式之单例模式 单例设计模式是怎么来的?在面向对象的程序设计中,当业务并发量非常大时,那么就会出现重复创建相同的对象,每创建一个对象就会开辟一块内存空间,而这些对象其实是一模一样的,那么有没有办法 ...
- Python设计模式之单例模式
1.由于语言的特性不同,设计模式的实现方式和实现难度也会不同 2.有的模式已经在语言内置了,比如迭代器模式. 3.单例模式可以直接用模块级变量来实现 4.普通工厂模式可以直接通过传入"类名& ...
- python设计模式之单例模式(一)
单例设计模式的概念: 单例设计模式即确保类有且只有一个特定类型的对象,并提供全局访问点.一般我们操作数据库的时候为了避免统一资源产生互相冲突,创建单例模式可以维护数据的唯一性. 单例模式的特性: 确保 ...
- 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会帮我们构造一个该类的实例.这么做会比较耗费资源. 如果 ...
随机推荐
- c++ STL stack容器成员函数
这是后进先出的栈,成员函数比较简单,因为只能操作栈顶的元素.不提供清除什么的函数. 函数 描述 bool s.empty() 栈是否为空(即size=0).若空,返回true,否则,false. vo ...
- 网络编程——基于UDP的网络化CPU性能检测
网络化计算机性能检测软件的开发,可对指定目标主机的CPU利用率进行远程检测,并自动对远程主机执行性能指标进行周期性检测,最终实现图形化显示检测结果. 网络通信模块:(客户端类似,因为udp是对等通信) ...
- 比特币中P2SH(pay-to-script-hash)多重签名的锁定脚本和解锁脚本
P2SH(pay-to-script-hash)多重签名的脚本 P2SH是多重签名的一种应用形式.在P2SH的交易中,多了一个Redeem Script的概念,称为赎回脚本.当向P2SH脚本的地址转账 ...
- 【洛谷2216】[HAOI2007] 理想的正方形(二维RMQ)
点此看题面 大致题意: 求出一个矩阵中所有\(n*n\)正方形中极差的最小值. 另一种做法 听说这题可以用单调队列去做,但是我写了一个二维\(RMQ\). 二维\(RMQ\) \(RMQ\)相信大家都 ...
- BZOJ 4128: Matrix
BZOJ 4128: Matrix 标签(空格分隔): OI BZOJ 大步小步 矩阵 费马小定理 Time Limit: 10 Sec Memory Limit: 128 MB Descriptio ...
- Python求列表中某个元素的下标
一.求列表中某个元素的下标 def findindex(org, x, pos=-1): counts = org.count(x) #先求出org中包含x的个数 if counts == 0: #个 ...
- android设备局域网中快速搜索之cling方式
cling方式就像pc端windows局域网工作组刷新显示一样,原来用过扫描ip地址的方式,可以使用就是有点慢,还有一种自己加入组广播,通过发送组广播的方式. android设备局域网中快速搜索之 ...
- js中的||、&&与!用法
&&和||在JQuery源代码内尤为使用广泛,由网上找了些例子作为参考,对其用法研究了一下: 1. && function a(){ alert("a&quo ...
- 2018.11.5 Nescafe26 T1 小猫爬山
题目 题目描述 Freda 和 rainbow 饲养了 N 只小猫,这天,小猫们要去爬山.经历了千辛万苦,小猫们 终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<). Fre ...
- (SSO)单点登录原理和总结
一:什么是单点登录(single Sign-On) SSO 是一种统一认证和授权机制,指访问统一服务器不用应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后, 再访问其他应用中 ...