python单例设计模式_Python教程:python设计模式之单例设计模式

一、单例 设计模式 存在 的价值

我们 需要 了解 单例模式 设计模型中的单例模式 在这里的含义,指的是当前 进程中只有一个实例(实例:一个类只被允许 创建了一个 对象,就可以说成是创建了一个 实例)。

只用 一个 实例 去进行 程序设计 被叫做 单例模式 设计模型 。

那么 我们可以先了解一下 哪些 场景 中不适合 用单例模式 去设计 ,举个示例 来说 ,我们 需要 用类去同时 创建 好几个 对象 ,且每个 对象 中封装 了不一样 的数据资料 的情形 下,就不能 使用 单例模式 去进行 程序设计 ,好比 接下来 的示例 :

class Person:

def __init__(self,name,age):

self.name = name

self.age = age

mingming = Person('明明',19)

mingyue = Person('明月',30)

mingri = Person('明日',20)

我们在什么情况下 适合 使用 单案例 设计模式 ?

如果 每个 对象 包含 相同 的数据信息,但需要 创建 多个 对象 ,同时 这两个例子 具有 相同 的功能 ,那么 我们 需要 使用 一个 例子 来完成 就是 所谓 的单个 例子 设计模式 ,例如 :

class Person:

def __init__(self):

self.name = '123123'

self.age = '20'

def f1(self):

pass

def f2(self):

pass

mingming = Person()

mingming.f1()

mingyue = Person()

mingyue.f1()

使用 单例 设计模式 究竟是为了什么,简单 来说 就是在封装数据 信息 相同,且每个 实例 可执行程序的方法 相同的情况下,无须 创建 多个 对象,仅使用 一个 实例去实现 想要 实现的功能,利用 单例 设计模式 可以 极大地减少 内存的使用。

二、单例模式 使用 的场景:

1.一个 对象 需要 频繁 地被 创建 或者 销毁 ;

2.创建 或销毁 时的性能 无法 优化 ,时耗过长 或占用 资源 过多 ,且又经常 用到 的对象 ;

3.工具类 的对象 ;

4.经常 访问 数据库连接 或文件 的对象 。

三、单例模式 的优缺点 。

1、优点 。

系统内存只有一个对象 ,节省 了系统资源 。

对某些 对象 来说 ,需要 经常 创建 和销毁 ,使用 单例 设计模式 可以 提高 系统 性能 。

由于 存储器 中只有 单个 设计模式 实例 ,因此 减少 了存储器 开销 。

单例设计模式 可以 避免 多次 占用 资源 。

例如 ,当一个 文件 被写入 时,因为 内存 中只有一个实例 ,所以 可以 避免 同时 写入 同一个 资源 文件 。

单实例 设计模式 可以 设置 全局 访问 点,优化 资源 访问 并共享 。

在使用 singleton模式 时,更多 考虑 的是如何防止它被多个 线程 同时 创建 。

当这个 类的对象 在很多 地方 创建 时,内部 方法 被多次 调用 ,但希望 只有一个对象 操作 这个 方法 ,或者 不希望 同时 在很多 地方 调用 这个 方法 ,需要 保持 这个 方法 的单一 属性 ,所以 使用 简单 的盈利模式 。

2、缺点 。

采用 单例模式 难以 进行 扩展 。

扩展 时,除了 修改 代码 外,几乎 没有 第二种 方法 。

四、单例 设计模式 代码 编译 。

现在我们来模拟 数据库连接 连接池 ,实现 单实例 设计模式 。

首先 ,我们 来介绍一下数据库连接 连接池 。

在通过 程序处理 数据库连接 时,我们 每次 都需要 连接 到数据库连接 ,但要 花很长时间 才能 连接 到数据库连接 ,因此 我们可以在主机 内存 中维护 数据库 连接池 。

在这个连接池 中,有几个 连接 连接 到了 数据库连接 。

当我们 想连接 到数据库 时,我们可以直接 从连接池 中取出 一个 连接 ,以节省 连接时间 。

单例模式:

import random

class SqlConnectionPool:

__instance = None

def __init__(self):

self.ip = "127.0.0.1"

self.port = 3306

self.pwd = '123456'

self.username = 'alexsel'

#去连接

self.conn_list = [1,2,3,4,5,6,7,8,9,10]

@staticmethod   #静态方法是由类调用的

def get_instance():

if SqlConnectionPool.__instance:

return SqlConnectionPool.__instance

else:

#创建一个对象,并将对象赋值给静态字段__instance

SqlConnectionPool.__instance = SqlConnectionPool()

return SqlConnectionPool.__instance

五、单例模式 的关键 代码 分析 。

#第一次 调用 这种 静态方法 时,判断 __ instacne的值为 none,因此 执行 else ,在else 中创建对象 ,分配 给staticfield __ insta nce,返回 该静态 字段 。

此静态方法 在#第二次 被调用 时被判定 __ insta nce为真,因此 直接 返回 此静态 字段 ,该静态 字段 包含 第一次 创建 的对象 ,因此 稍后 将调用 此方法 。

#只调用 第一个 制作 的对象 ,这是 单例 设计模式 。

def get_connection(self):

#获取连接

r = random.randrange(1,11)

return r

#我们 用相同 的内存地址 创建 多个 对象 ,这意味着 我们 得到 相同 的对象 。

obj = SqlConnectionPool.get_instance()

print(obj)

obj1 = SqlConnectionPool.get_instance()

print(obj1)

obj2 = SqlConnectionPool.get_instance()

print(obj2)

输出结果:

以上是我基于类,使用静态字段和静态方法实现的一个单例模式的全部分享内容,希望对大家 有所 帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值