python设计模式---创建型之单例模式
数据结构和算法是基本功,
设计模式是最佳实现。
作为程序员,必须有空了就练一练哈。
# coding = utf-8 """ # 经典单例 class Singleton: def __new__(cls): if not hasattr(cls, 'instance'): cls.instance = super(Singleton, cls).__new__(cls) return cls.instance s1 = Singleton() print('Object created', s1) s2 = Singleton() print('Object created', s2) # 单例模式中的懒汉式实例化 class Singleton: __instance = None def __init__(self): if not Singleton.__instance: print('__init__ method called...') else: print('Instance already created: ', self.get_instance()) @classmethod def get_instance(cls): if not cls.__instance: cls.__instance = Singleton() return cls.__instance s1 = Singleton() print("Object created ", Singleton.get_instance()) s2 = Singleton() # 通过__init__实现Monostate单态模式 class Borg: __shared_stat = {"1": "one"} def __init__(self): self.x = 1 self.__dict__ = self.__shared_stat pass b1 = Borg() b2 = Borg() b1.x = 4 print('Borg Object b1: ', b1) print('Borg Object b2: ', b2) print('Object State b1: ', b1.__dict__) print('Object State b2: ', b2.__dict__) # 通过__new__实现Monostate单态模式 class Borg: __shared_stat = {"1": "one"} def __new__(cls, *args, **kwargs): obj = super().__new__(cls, *args, **kwargs) obj.__dict__ = cls.__shared_stat return obj b1 = Borg() b2 = Borg() b1.x = 4 print('Borg Object b1: ', b1) print('Borg Object b2: ', b2) print('Object State b1: ', b1.__dict__) print('Object State b2: ', b2.__dict__) # 元类示例 class MyInt(type): def __call__(cls, *args, **kwargs): print('****Here is my int****', args) print('Now do whatever you want with this object...') return type.__call__(cls, *args, **kwargs) class int(metaclass=MyInt): def __init__(self, x, y): self.x = x self.y = y i = int(4, 5) # 基于元类的单例 class MetaSingleton(type): _instances = {} def __call__(cls, *args, **kwargs): if cls not in cls._instances: cls._instances[cls] = super().__call__(*args, **kwargs) return cls._instances[cls] class Logger(metaclass=MetaSingleton): pass logger1 = Logger() logger2 = Logger() print(logger1, logger2) # sqlite3数据库连接单例 import sqlite3 class MetaSingleton(type): _instances = {} def __call__(cls, *args, **kwargs): if cls not in cls._instances: cls._instances[cls] = super().__call__(*args, **kwargs) return cls._instances[cls] class Database(metaclass=MetaSingleton): connection = None cursor = None def connect(self): if self.connection is None: self.connection = sqlite3.connect('db.sqlite3') self.cursor = self.connection.cursor() return self.cursor db1 = Database().connect() db2 = Database().connect() print('Database Objects DB1', db1) print('Database Objects DB2', db2) """ # 监控服务器单例 class HealthCheck: _instance = None _servers = [] def __new__(cls, *args, **kwargs): print('====new====') if not cls._instance: cls._instance = super().__new__(cls, *args, **kwargs) print(cls._instance) print('=======cls._instance========', cls._instance) return cls._instance # def __init__(self): # print('====init====') # self._servers = [] def add_server(self): self._servers.append('Server 1') self._servers.append('Server 2') self._servers.append('Server 3') self._servers.append('Server 4') self._servers.append('Server 5') print(self._servers) def change_server(self): self._servers.pop() self._servers.append('Server 6') print(self._servers) def __len__(self): return len(self._servers) hc1 = HealthCheck() hc1.add_server() print('Schedule health check for server (1)...') for i in range(len(hc1)): print('Checking ', hc1._servers[i]) hc2 = HealthCheck() hc2.change_server() print('Schedule health check for server (2)...') for i in range(len(hc2)): print('Checking ', hc2._servers[i])
C:\Users\Sahara\.virtualenvs\test\Scripts\python.exe C:/Users/Sahara/PycharmProjects/test/python_search.py ====new==== <__main__.HealthCheck object at 0x00000000021E35F8> =======cls._instance======== <__main__.HealthCheck object at 0x00000000021E35F8> ['Server 1', 'Server 2', 'Server 3', 'Server 4', 'Server 5'] Schedule health check )... Checking Server Checking Server Checking Server Checking Server Checking Server ====new==== =======cls._instance======== <__main__.HealthCheck object at 0x00000000021E35F8> ['Server 1', 'Server 2', 'Server 3', 'Server 4', 'Server 6'] Schedule health check )... Checking Server Checking Server Checking Server Checking Server Checking Server Process finished with exit code
python设计模式---创建型之单例模式的更多相关文章
- Python设计模式 - 创建型 - 单例模式(Singleton) - 十种
对于很多开发人员来说,单例模式算是比较简单常用.也是最早接触的设计模式了,仔细研究起来单例模式似乎又不像看起来那么简单.我们知道单例模式适用于提供全局唯一访问点,频繁需要创建及销毁对象等场合,的确方便 ...
- 【python设计模式-创建型】工厂方法模式
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻 ...
- python设计模式---创建型之工厂模式
# coding = utf-8 from abc import ABCMeta, abstractmethod # 简单工厂模式 class Animal(metaclass=ABCMeta): @ ...
- [Python编程实战] 第一章 python的创建型设计模式1.1抽象工厂模式
注:关乎对象的创建方式的设计模式就是“创建型设计模式”(creational design pattern) 1.1 抽象工厂模式 “抽象工厂模式”(Abstract Factory Pattern) ...
- 设计模式01 创建型模式 - 单例模式(Singleton Pattern)
参考 [1] 设计模式之:创建型设计模式(6种) | 博客园 [2] 单例模式的八种写法比较 | 博客园 单例模式(Singleton Pattern) 确保一个类有且仅有一个实例,并且为客户提供一 ...
- C# 设计模式·创建型模式
面试问到这个··答不出来就是没有架构能力···这里学习一下···面试的时候直接让我说出26种设计模式··当时就懵逼了··我记得好像之前看的时候是23种的 还有3个是啥的··· 这里先列出几种创建型模式 ...
- javaScript设计模式-创建型设计模式
我们大家一听到设计模式就感觉设计模式是一个高端的东西,到底什么是设计模式呢?其实设计模式也就是我们的前辈在写代码的时候遇到的问题,提出的解决方案,为了方便人与人之间的交流,取了个名字,叫做设计模式. ...
- java设计模式--创建型模式(一)
2016-04-24 10:10:34 创建型模式:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式 注意:工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂 ...
- [19/04/22-星期一] GOF23_创建型模式(单例模式)
一.概念 <Design Patterns: Elements of Reusable Object-Oriented Software>(即后述<设计模式>一书),由 Eri ...
随机推荐
- [SimplePlayer] 6. 音频同步
音频的同步并不需要我们在程序实现.在设置好声道.采样率.音频格式后,程序只需要保证能一直提供音频数据就行,其余工作基本都由声卡实现.
- openstack——删除网络
#!/bin/bash #delete vm for vim in `nova list |awk '{if( NR > 2 ) {print $2}}'`;do nova delete $vi ...
- [curl]convert curl to python Ruby
https://curl.trillworks.com/
- Java【第六篇】面向对象基础
类和对象 面向对象的概念 面向过程 核心是过程二字,过程指的是解决问题的步骤,设计一条流水线,机械式的思维方式: 面向对象 核心就是对象二字,对象就是特征与技能的结合体,利用“类”和“对象”来创建各种 ...
- Python【第一篇】python安装、pip基本用法、变量、输入输出、流程控制、循环
一.python安装 Ubuntu下 系统版本已经同时安装了python2和python3 如果没有python3,可以参考这个貌似是印度阿三的安装视频:http://v.youku.com/v_sh ...
- CentOS7 Zabbix3.4安装
依赖于lnmp或者lamp环境: 1.下载源码包 # wget -O zabbix-3.4.2.tar.gz http://sourceforge.net/projects/zabbix/files/ ...
- ubuntu不能联网的问题
控制面板\网络和 Internet\网络和共享中心-->更改>配器设置-->以太网-->右键属性-->共享-->允许其他网络用户通过此计算机的internet连接来 ...
- pytest 10 skip跳过测试用例
pytest.mark.skip可以标记无法在某些平台上运行的测试功能,或者你希望失败的测试功能 skip意味着只有在满足某些条件时才希望测试通过,否则pytest应该跳过运行测试.常见事例时非win ...
- Python统计词频的几种方式
语料 text = """My fellow citizens: I stand here today humbled by the task before us, gr ...
- 常见Web攻击
一.SQL注入 1. sql注入的危害 非法读取.篡改.删除数据库中的数据 盗取用户的各类敏感信息,获取利益 通过修改数据库来修改网页上的内容 注入木马等 2. 实例 MYSQLDB # 通过在用户名 ...