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会帮我们构造一个该类的实例.这么做会比较耗费资源. 如果 ...
随机推荐
- The 12th Zhejiang Provincial Collegiate Programming Contest - I Earthstone Keeper浙江省赛
题目:http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5501 思路:DFS,用了递归就溢出,所以可能得用非递归的. ...
- pta数据结构编程题
编程题6 树的同构 编程题7 List Leaves 编程题8 Tree Traversals Again 编程题10 Root of AVL Tree 编程题12 堆中的路径 编程题13 File ...
- shell脚本常识
--------------------------------------------------------------- -------------- 概要 -- ...
- 2017.12.25 Linux系统的使用
Linux系统的使用 现在标配的系统是 Linux + Nginx + PHP + MySQL ,这样的配置越来越多的大公司在用的了说到配置不同的是一个公司的规约,比如说挂载一般分为2个盘, / 下面 ...
- MFC-[转]基于MFC的ActiveX控件开发
作者:lidan | 出处:博客园 | 2012/3/13 16:10:34 | 阅读22次 ActiveX 控件是基于组件对象模型 (COM) 的可重用软件组件,广泛应用于桌面及Web应用中.在VC ...
- 【转帖】Linux mount 域控权限的共享目录
https://www.linuxidc.com/Linux/2012-09/71388.htm 之前一直以为没法 映射 home 域的内容 其实还有一个地方.. 注意 空格的话 需要用 \ 进行转移 ...
- cuda中当元素个数超过线程个数时的处理案例
项目打包下载 当向量元素超过线程个数时的情况 向量元素个数为(33 * 1024)/(128 * 128)=2.x倍 /* * Copyright 1993-2010 NVIDIA Corporati ...
- Nodejs:Node.js模块机制小结
今天读了<深入浅出Nodejs>的第二章:模块机制.现在做一个简单的小结. 序:模块机制大致从这几个部分来讲:JS模块机制的由来.CommonJS AMD CMD.Node模块机制和包和n ...
- python的对数
python的对数 首先要导入 math 模块: import math import numpy as np math.log(8,2),此为以2为底8的对数 等于 math.log2(8); 等于 ...
- 项目十八-Hadoop+Hbase分布式集群架构“完全篇”
本文收录在Linux运维企业架构实战系列 前言:本篇博客是博主踩过无数坑,反复查阅资料,一步步搭建,操作完成后整理的个人心得,分享给大家~~~ 1.认识Hadoop和Hbase 1.1 hadoop简 ...