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 ...
随机推荐
- consul如何限制注册的ip
假设当前服务器的ip是:192.168.56.130 允许 所有ip 注册 consul agent -server -ui -bootstrap-expect=1 -data-dir=/usr/lo ...
- mysql慢查询日志按天切割归纳
问题描述: mysql开启慢查询功能,再正常不过,那么存在这样一种情况:慢查询写入的文件位置和文件名是指定好的,如果慢查询时间设定严苛,不出意外,记录慢查询的单个文件大小会日益增大,几十兆或者上百兆, ...
- Security+认证812分轻松考过(备战分享)
2019.02.12,开工第一天,我参加了security+考试并顺利通过了考试,812分的成绩有点出乎我的意料,据我所知我周围还没有人考过800分的.怀着愉悦的心态分享下我的备考经历和考试经验. 备 ...
- C++(1):error: invalid conversion from ‘void (*)()’ to ‘void (*)(int)
void signaldemo_test(void) { struct itimerval tv, otv; signal(SIGALRM, sigFunc); //how long to run t ...
- Linux Centos7.x下安装部署Jira和confluence以及破解方法详述
简述 JIRA是Atlassian公司出品的项目与事务跟踪工具,被广泛应用于缺陷跟踪.客户服务.需求收集.流程审批.任务跟踪.项目跟踪和敏捷管理等工作领域. Confluence是一个专业的企业知识管 ...
- 金融量化分析【day113】:聚宽自带策略
一.策略代码 # 导入函数库 from jqdata import * # 初始化函数,设定基准等等 def initialize(context): # 设定沪深300作为基准 set_benchm ...
- Connection to Oracle failed. [66000][12505] Listener refused the connection with the following error: ORA-12505, TNS:listener does not currently know of SID given in connect descriptor .
我安装了Oracle数据库,默认的数据库用户名是system,密码口令是安装过程中你自己设置的.可以先使用命令框,输入 sqlplus system; 然后再输入密码即可. 然后我的数据库连接工具使用 ...
- Hadoop记录- Yarn scheduler队列采集
#!/bin/sh ip=10.116.100.11 port=8088 export HADOOP_HOME=/app/hadoop/bin rmstate1=$($HADOOP_HOME/yarn ...
- NOI-OJ 2.2 ID:3089 爬楼梯
整体思路 这是一个典型的递归型问题: 临界点:如果只有1级台阶,有1种走法(一次一步):如果有2级台阶,则有2种走法(一次一步或一次两步) 递归方法,对于n级台阶,如果第一次走1步,还剩n-1级台阶, ...
- Java设计模式之抽象工厂
概述 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结. 使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证代码可靠性. 设计模式 ...