CSIC_716_20191129【 单例模式 的五种实现方式】
单例模式
单例模式:在确定类中的属性和方法不变时,需要反复调用该类的情况。 让所有通过该类实例化出的对象,都指向同一个内存地址。
优点:节省内存空间。
单例模式有五种表现形式:
1.通过classmethod实现
2.通过__new__实现
3.通过导入模块时实现
4.通过装饰器实现
5.通过元类实现
1.通过classmethod实现
classmethod单例开辟的空间中,最新的内容是第一次被更新的。之后的对象统一以【最初】的为准
class Sun:
__instance = None def __init__(self, ip, port):
self.ip = ip
self.port = port @classmethod
def single(cls, ip, port):
if not cls.__instance:
cls.__instance = cls(ip, port) return cls.__instance obj1 = Sun.single('192.168.1.1', 9090)
obj2 = Sun.single('127.0.0.1', 8080)
obj3 = Sun.single('255.255.255.0', 7070)
print(obj3.ip) # 192.168.1.1
print(obj2.ip) # 192.168.1.1
print(obj1.ip) # 192.168.1.1
2.通过__new__实现
__new__单例开辟的空间中,最新的内容是最后一次被更新的。之前的对象统一以【最新】的为准.
class Sun:
__instance = None def __init__(self, ip, port):
self.ip = ip
self.port = port def __new__(cls, *args, **kwargs): # 此处传入的参数只和类相关,其他的。
if not cls.__instance:
cls.__instance = object.__new__(cls) return cls.__instance obj1 = Sun('192.168.1.1', 9090)
obj2 = Sun('127.0.0.1', 8080)
obj3 = Sun('255.255.255.0', 7070)
print(obj3.ip) # 255.255.255.0
print(obj2.ip) # 255.255.255.0
print(obj1.ip) # 255.255.255.0
3.通过元类实现单例模式
元类单例开辟的空间中,最新的内容是第一次被更新的。之后的对象统一以【最初】的为准
# _*_ coding: gbk _*_
# @Author: Wonder
class Singleton(type):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) # 继承
self._instance = None # 派生 def __call__(self, *args, **kwargs):
if not self._instance:
self._instance = super().__call__(*args, **kwargs)
return self._instance # 调用就返回 class MySQL(metaclass=Singleton):
def __init__(self, host, port):
self.host = host
self.port = port obj1 = MySQL('192.168.1.1', 9090)
obj2 = MySQL('127.0.0.1', 8080)
obj3 = MySQL('255.255.255.0', 7070)
print(obj1.host) # 192.168.1.1
print(obj2.host) # 192.168.1.1
print(obj3.host) # 192.168.1.1
CSIC_716_20191129【 单例模式 的五种实现方式】的更多相关文章
- iOS开发中数组常用的五种遍历方式
随着iOS的不断发展,apple也不断推出性能更高的数组遍历方式,下面将对熟悉的五种遍历方式进行列举. 首先定义一个数组,并获取数组长度 NSArray *array=@[",]; NSIn ...
- JAVA中单例模式的几种实现方式
1 线程不安全的实现方法 首先介绍java中最基本的单例模式实现方式,我们可以在一些初级的java书中看到.这种实现方法不是线程安全的,所以在项目实践中如果涉及到线程安全就不会使用这种方式.但是如果不 ...
- Spring事务Transaction配置的五种注入方式详解
Spring事务Transaction配置的五种注入方式详解 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学 ...
- CacheConcurrencyStrategy五种缓存方式
CacheConcurrencyStrategy有五种缓存方式: CacheConcurrencyStrategy.NONE,不适用,默认 CacheConcurrencyStrategy.REA ...
- IPC五种通讯方式
IPC五种通讯方式 1.管道:速度慢,容量有限,只有父子进程能通讯 2.FIFO:任何进程间都能通讯,但速度慢 3.消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题 ...
- LFU五种实现方式,从简单到复杂
前言 最近刷力扣题,对于我这种 0 基础来说,真的是脑壳疼啊.这个月我估计都是中等和困难题,没有简单题了. 幸好,力扣上有各种大牛给写题解.看着他们行云流水的代码,真的是羡慕不已.让我印象最深刻的就是 ...
- Python 单例模式的几种实现方式
单例模式的几种实现方式 先来看几个魔法方法的简单运用:__new__, __init__, __call__. class A(object): def __init__(self, x): prin ...
- JS 跨域问题常见的五种解决方式
一.什么是跨域? 要理解跨域问题,就先理解好概念.跨域问题是由于javascript语言安全限制中的同源策略造成的. 简单来说,同源策略是指一段脚本只能读取来自同一来源的窗口和文档的属性,这里的同一来 ...
- Python中的单例模式的几种实现方式的优缺点及优化
单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...
随机推荐
- 解决HDFS小文件带来的计算问题
hive优化 一.小文件简述 1.1. HDFS上什么是小文件? HDFS存储文件时的最小单元叫做Block,Hadoop1.x时期Block大小为64MB,Hadoop2.x时期Block大小为12 ...
- 提交disable的Select值到后台
需求:界面上把select控件disable,然后将默认值传到后台 问题1:select disable: js中可以这样写: document.getElementById("provin ...
- vue--先决篇
一.vue介绍: vue是一个渐进式Javascript框架. 渐进式:即有一个核心库,在需要的时候,在逐渐添加插件的一种概念. (1)MVVM和MVC模式: MVVM是Model-View-View ...
- Spring中AOP的基于xml开发和配置
pom文件: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http ...
- nginx自动切割日志脚本
#!/bin/bash savepath_log='/data/logs' nglogs='/data/logs' mkdir -p $savepath_log/$(date +%Y)/$(date ...
- 注册Bean
<spring源码深度解析>笔记 1.给容器中注册组件 (1).包扫描+组件注解: (2).@Bean(导入第三方包里面的组件): (3).@Import给容器中快速的导入一个组件: 2. ...
- C# 16进制转字符串,字符串转16进制
{ //========================================================== //16进制转字符串 public static byte[] HexTo ...
- SQL 空值
SQL NULL Values(空值) 什么是SQL NULL值? SQL 中, NULL 用于表示缺失的值.数据表中的 NULL 值表示该值所处的字段为空. 具有NULL值的字段是没有值的字段. 如 ...
- Yii2 使用十一 在设置enablePrettyUrl时候,defaultAction的设置方法
启用美化Url的功能 'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' => false, 'enableS ...
- 【LeetCode 26】删除排序数组中的重复项
题目链接 [题解] 沙比提 [代码] class Solution { public: int removeDuplicates(vector<int>& nums) { if ( ...