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会帮我们构造一个该类的实例.这么做会比较耗费资源. 如果 ...
随机推荐
- OpenGL glReadPixels 转成 CImage
本来是一件很简单的事情,就是将View上使用OpenGL画出来的数据生成图片让其实现打印的功能,我们知道MFC提供打印的接口是不支持OpenGL的(至少我不清楚),必须将它转成GDI再画在Print的 ...
- 打造颠覆你想象中的高性能,轻量级的webform框架---js直接调后台的封装(第三天)
如果你没有看我第二天写的内容的,我想你是看不懂的!!!! 好了,废话不多说,怎么才能让我们的代码变得牛逼起来呢?怎么封装我们的代码呢?我们不可能 每个页面都需要那样写吧,那我们来一步一步来封装 我们的 ...
- postman传递参数的问题
postman是一款通过post或者get发送请求测试代码的工具 如果是类的话,就选择JSON格式,如果是一个字段的方法,就直接写入方法值就好了比如 public PageResult<Info ...
- 【51nod1705】七星剑(成环DP)
点此看题面 大致题意: 你要把一把剑从0星升至7星,有n颗宝石供你选择,第i颗宝石的价值是c[i],用第i颗宝石将剑从k-1星升至k星的成功率是prob[k][i],而失败后会掉lose[k][i], ...
- 2018.5.20 oracle强化练习
--现在有一个商店的数据库,记录客户以及购物的情况, 商品表goods (商品号 goodsid varchar2(8) 商品名 goodsname varchar2(20) 单价 unitprice ...
- python_73_pickle序列化(接72)
# json(为字符串形式)用于不同语言之间的数据交互,只适用于简单的数据交互,字典之类可以,函数就不行了,如下例 ''' import json def say(name):print('Hi!', ...
- Python实现注册和登录
一.注册账号需要实现的功能 1.输入:用户名,密码,密码确认 2.限制1:输入的账号和密码不能为空 3.限制2:两次输入密码必须一致 4.限制3:用户名不能重复 5.限制4:错误次数为4次 6.用字典 ...
- Bootstrap历练实例:响应式布局
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- React后台管理系统-后台接口封装
1新建文件夹 service ,里边建4个文件,分别是statistic-service.jsx 首页数据统计接口, user-service.jsx用户接口, product-service.jsx ...
- 初尝微信小程序1-特点
微信小程序特点:1.不需要下载安装即可使用 2.用户用完即走,不用关心是否安装太多应用 3.应用将无处不在,随时可用 适合开发的小程序类型:1.简单的用完即走的应用 2.低频的应用 3.性能要求不高的 ...