单例模式

单例模式:在确定类中的属性和方法不变时,需要反复调用该类的情况。  让所有通过该类实例化出的对象,都指向同一个内存地址。

优点:节省内存空间。

单例模式有五种表现形式:

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【 单例模式 的五种实现方式】的更多相关文章

  1. iOS开发中数组常用的五种遍历方式

    随着iOS的不断发展,apple也不断推出性能更高的数组遍历方式,下面将对熟悉的五种遍历方式进行列举. 首先定义一个数组,并获取数组长度 NSArray *array=@[",]; NSIn ...

  2. JAVA中单例模式的几种实现方式

    1 线程不安全的实现方法 首先介绍java中最基本的单例模式实现方式,我们可以在一些初级的java书中看到.这种实现方法不是线程安全的,所以在项目实践中如果涉及到线程安全就不会使用这种方式.但是如果不 ...

  3. Spring事务Transaction配置的五种注入方式详解

    Spring事务Transaction配置的五种注入方式详解 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学 ...

  4. CacheConcurrencyStrategy五种缓存方式

    CacheConcurrencyStrategy有五种缓存方式:  CacheConcurrencyStrategy.NONE,不适用,默认  CacheConcurrencyStrategy.REA ...

  5. IPC五种通讯方式

    IPC五种通讯方式 1.管道:速度慢,容量有限,只有父子进程能通讯 2.FIFO:任何进程间都能通讯,但速度慢 3.消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题 ...

  6. LFU五种实现方式,从简单到复杂

    前言 最近刷力扣题,对于我这种 0 基础来说,真的是脑壳疼啊.这个月我估计都是中等和困难题,没有简单题了. 幸好,力扣上有各种大牛给写题解.看着他们行云流水的代码,真的是羡慕不已.让我印象最深刻的就是 ...

  7. Python 单例模式的几种实现方式

    单例模式的几种实现方式 先来看几个魔法方法的简单运用:__new__, __init__, __call__. class A(object): def __init__(self, x): prin ...

  8. JS 跨域问题常见的五种解决方式

    一.什么是跨域? 要理解跨域问题,就先理解好概念.跨域问题是由于javascript语言安全限制中的同源策略造成的. 简单来说,同源策略是指一段脚本只能读取来自同一来源的窗口和文档的属性,这里的同一来 ...

  9. Python中的单例模式的几种实现方式的优缺点及优化

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

随机推荐

  1. HDU-3001 TSP+三进制DP

    题意:给出一个无向图,每个点不能被经过超过两次,选择一个起点问经过所有点至少一次的最短路径. 解法:注意此题是每个点不能经过超过两次,这和一般的TSP问题不同.但是也没有使得此题变得很复杂,原来的状态 ...

  2. Eclipse中发布Maven管理的Web项目时找不到类的问题根源和解决办法(转)

    转自:http://blog.csdn.net/lvguanming/article/details/37812579?locationNum=12 写在前面的话 现在是越来越太原讨厌Eclipse这 ...

  3. (PASS)break 和 continue 的区别

    1  break;  while循环中,break是用于永久终止循环.即不执行本次循环中break后面的语句,直接跳出循环. 终止,跳出,结束循环(可以作用在任何地方).也常与switch分支结构合用 ...

  4. 62. File类常用方法

    为了怕混淆,先说明一些下面要出现的名词意思:例如:D:\\新建文件夹 (2)\\a.txt 和  D:\\新建文件夹 (2)\\aaaa D:\\新建文件夹 (2)   父路径    a.txt    ...

  5. Spring Boot 集成Mybatis实现多数据源

    静态的方式 我们以两套配置方式为例,在项目中有两套配置文件,两套mapper,两套SqlSessionFactory,各自处理各自的业务,这个两套mapper都可以进行增删改查的操作,在这两个主MYS ...

  6. delphi 窗体的位置和高宽度-TForm:Letf、Top、Width、Height、ClientWidth、ClientHeight

    delphi 窗体的位置和高宽度-TForm:Letf.Top.Width.Height.ClientWidth.ClientHeight [窗体的高度和宽度]: [客户区的高度和宽度]: [窗体在屏 ...

  7. 【LeetCode 14】最长公共前缀

    题目链接 [题解] 二分最长前缀的长度. 然后暴力把第2..n个字符串和第1个字符串的前mid个字符匹配. 还有一种比较厉害的算法. 把这n个字符串加入到字典树当中去. 然后根节点到第一个有分支的节点 ...

  8. BZOJ 1927: [Sdoi2010]星际竞速(费用流)

    传送门 解题思路 仿照最小路径覆盖问题,用费用流解决此题.最小路径覆盖问题是拆点连边后用\(n-\)最大匹配,这里的话也是将每个点拆点,源点向入点连流量为\(1\),费用为\(0\)的边,向出点连流量 ...

  9. NX二次开发-C语言文件读写fwrite和fread函数

    NX9+VS2012 #include <uf.h> #include <stdio.h> UF_initialize(); /* //设置文件路径 const char* f ...

  10. SVG和canvas

    1.SVG实现的圆环旋转效果 参考:http://www.softwhy.com/article-6472-1.html 2.SVG中的图形可以通过  transform="matrix(0 ...