单例模式就是告诉你,只有一个对象

(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设计模式之一(单例模式)的更多相关文章

  1. python设计模式之单例模式(一)

    前言 单例模式是创建模式中比较常见和常用的模式,在程序执行的整个生命周期只存在一个实例对象. 系列文章 python设计模式之单例模式(一) python设计模式之常用创建模式总结(二) python ...

  2. python设计模式之单例模式(二)

    上次我们简单了解了一下什么是单例模式,今天我们继续探究.上次的内容点这 python设计模式之单例模式(一) 上次们讨论的是GoF的单例设计模式,该模式是指:一个类有且只有一个对象.通常我们需要的是让 ...

  3. python设计模式之单例模式(转)

    设计模式之单例模式 单例设计模式是怎么来的?在面向对象的程序设计中,当业务并发量非常大时,那么就会出现重复创建相同的对象,每创建一个对象就会开辟一块内存空间,而这些对象其实是一模一样的,那么有没有办法 ...

  4. Python设计模式之单例模式

    1.由于语言的特性不同,设计模式的实现方式和实现难度也会不同 2.有的模式已经在语言内置了,比如迭代器模式. 3.单例模式可以直接用模块级变量来实现 4.普通工厂模式可以直接通过传入"类名& ...

  5. python设计模式之单例模式(一)

    单例设计模式的概念: 单例设计模式即确保类有且只有一个特定类型的对象,并提供全局访问点.一般我们操作数据库的时候为了避免统一资源产生互相冲突,创建单例模式可以维护数据的唯一性. 单例模式的特性: 确保 ...

  6. python设计模式之--单例模式

    python的单例模式就是一个类的实例只能自始自终自能创建一次.应用场景比如说数据库的连接池. #!/usr/bin/env python # coding=utf- class Foo(object ...

  7. Python设计模式中单例模式的实现及在Tornado中的应用

    单例模式的实现方式 将类实例绑定到类变量上 class Singleton(object): _instance = None def new(cls, *args): if not isinstan ...

  8. 【python 设计模式】单例模式

    单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. 比如,某 ...

  9. python 设计模式之 单例模式

    单例模式是做为"全局变量"的替代品出现的.所以它具有全局变量的特点:全局可见.贯穿应用程序的整个生命期,保证在程序执行中,某个类仅仅存在一个实例,所以通常不希望类中的构造函数被调用 ...

  10. python 设计模式之单例模式 Singleton Pattern

    #引入 一个类被设计出来,就意味着它具有某种行为(方法),属性(成员变量).一般情况下,当我们想使用这个类时,会使用new 关键字,这时候jvm会帮我们构造一个该类的实例.这么做会比较耗费资源. 如果 ...

随机推荐

  1. 在github中的READEME中添加图片或者动图

    在github中reademe中添加动图或者图片 将你需要展示的图片放在这个项目中的某个文件夹中,然后再reademe中这样引入 ![maze](https://github.com/GainLoss ...

  2. IE的Trident引擎下实现C++和Javascript相互调用

    我们知道实现C++和Javascript通讯有下表5种接口: 引擎 编写语言 API接口 C.C++与JavaScript交互(变量.函数.类) vc2005编译静态库的大小 示例EXE的大小 执行. ...

  3. 打造颠覆你想象中的高性能,轻量级的webform框架---js直接调后台的封装(第三天)

    如果你没有看我第二天写的内容的,我想你是看不懂的!!!! 好了,废话不多说,怎么才能让我们的代码变得牛逼起来呢?怎么封装我们的代码呢?我们不可能 每个页面都需要那样写吧,那我们来一步一步来封装 我们的 ...

  4. POJ 3734 Blocks (线性递推)

    定义ai表示红色和绿色方块中方块数为偶数的颜色有i个,i = 0,1,2. aij表示刷到第j个方块时的方案数,这是一个线性递推关系. 可以构造递推矩阵A,用矩阵快速幂求解. /*********** ...

  5. 2018.6.19 Java核心API与高级编程实践复习总结

    Java 核心编程API与高级编程实践 第一章 异常 1.1 异常概述 在程序运行中,经常会出现一些意外情况,这些意外会导致程序出错或者崩溃而影响程序的正常执行,在java语言中,将这些程序意外称为异 ...

  6. 2017.12.17 servlet 生命周期

    servlet生命周期一般分为4个: 加载----实例化------服务-----销毁 (1)加载: 加载一般是在运行tomcat容器时来完成,将servlet类加载到tomcat中,或者是客户端发来 ...

  7. 欠采样(undersampling)和过采样(oversampling)会对模型带来怎样的影响

    项目中出现了二分类数据不平横问题,研究总结下对于类别不平横问题的处理经验: 为什么类别不平横会影响模型的输出? 许多模型的输出类别是基于阈值的,例如逻辑回归中小于0.5的为反例,大于则为正例.在数据不 ...

  8. 浏览器 DNS缓存与DNS prefetch (DNS预解析)

    浏览器 DNS缓存 浏览器DNS缓存的时间跟DNS服务器返回的TTL值无关. 注:TTL(Time-To-Live),就是一条域名解析记录在DNS服务器中的存留时间. 浏览器在获取网站域名的实际IP地 ...

  9. jQuery Pagination分页插件--无刷新

    源码:https://github.com/SeaLee02/FunctionModule/blob/master/UploadFiles/WebDemo/FenYE/FenYeAjax.aspx 代 ...

  10. React后台管理系统-商品管理列表组件

    1.商品列表页面结构 <div id="page-wrapper">              <PageTitle title="商品列表" ...