python创建单例模式_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====

=======cls._instance======== <__main__.healthcheck object at>

['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>

['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设计模式 - 创建型 - 单例模式&lpar;Singleton&rpar; - 十种

对于很多开发人员来说,单例模式算是比较简单常用.也是最早接触的设计模式了,仔细研究起来单例模式似乎又不像看起来那么简单.我们知道单例模式适用于提供全局唯一访问点,频繁需要创建及销毁对象等场合,的确方便 ...

【python设计模式-创建型】工厂方法模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻 ...

python设计模式---创建型之工厂模式

# coding = utf-8 from abc import ABCMeta, abstractmethod # 简单工厂模式 class Animal(metaclass=ABCMeta): @ ...

&lbrack;Python编程实战&rsqb; 第一章 python的创建型设计模式1&period;1抽象工厂模式

注:关乎对象的创建方式的设计模式就是“创建型设计模式”(creational design pattern) 1.1 抽象工厂模式 “抽象工厂模式”(Abstract Factory Pattern) ...

设计模式01 创建型模式 - 单例模式&lpar;Singleton Pattern&rpar;

参考 [1] 设计模式之:创建型设计模式(6种) | 博客园 [2] 单例模式的八种写法比较 | 博客园 单例模式(Singleton  Pattern) 确保一个类有且仅有一个实例,并且为客户提供一 ...

C&num; 设计模式&&num;183&semi;创建型模式

面试问到这个··答不出来就是没有架构能力···这里学习一下···面试的时候直接让我说出26种设计模式··当时就懵逼了··我记得好像之前看的时候是23种的 还有3个是啥的··· 这里先列出几种创建型模式 ...

javaScript设计模式-创建型设计模式

我们大家一听到设计模式就感觉设计模式是一个高端的东西,到底什么是设计模式呢?其实设计模式也就是我们的前辈在写代码的时候遇到的问题,提出的解决方案,为了方便人与人之间的交流,取了个名字,叫做设计模式. ...

java设计模式--创建型模式(一)

2016-04-24 10:10:34 创建型模式:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式 注意:工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂 ...

&lbrack;19&sol;04&sol;22-星期一&rsqb; GOF23&lowbar;创建型模式&lpar;单例模式&rpar;

一.概念 (即后述一书),由 Eri ...

随机推荐

Redis集群~StackExchange&period;redis连接Sentinel服务器并订阅相关事件(原创)

回到目录 对于redis-sentinel我在之前的文章中已经说过,它是一个仲裁者,当主master挂了后,它将在所有slave服务器中进行选举,选举的原则当然可以看它的官方文章,这与我们使用者没有什 ...

angular学习的一些小笔记&lpar;中&rpar;之基础ng指令

一.布尔属性指令: ng-disabled:就是ng-disabled=true-->就指向不可用

jdk 安装

安装JDK 选择安装目录 安装过程中会出现两次 安装提示 .第一次是安装 jdk ,第二次是安装 jre .建议两个都安装在同一个java文件夹中的不同文件夹中.(不能都安装在java文件夹的根目录下 ...

Android常见控件— — —TextView

<?xml version="1.0" encoding="utf-8"?>

Ueditor 1&period;4&period;3 单独调用上传图片&comma;或文件功能

第一步, 引入文件

下载msysgit,安装 官方下载:http://code.google.com/p/msysgit/downloads/list, 打开Git Bash,运行命令 cd D: git clone h ...

Nginx配置同一个域名http与https两种方式都可访问

##配置 http://test.pay.joyhj.com https://test.pay.joyhj.com 两者都可访问 # vim /usr/local/nginx/conf/vhost/t ...

js中一些注意点 ps不断更新中&period;&period;&period;&period;

nextSibling 和 nextElementSibling 的区别 (previousSibling 和 previousElementSibling ) nextSibling 在IE8及以下 ...

jquery写的树状列表插件-alvintree

在做项目的时候遇到选择部门下人员的功能,可多选可单选,所以就想着使用树状列表来进行选择,但在网上找了很多,发现要么就是挺复杂,要么就是需要各种前端框架的支持,试了一个感觉难用,所以就想着自己写一个简便 ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值