数据结构和算法是基本功,

设计模式是最佳实现。

作为程序员,必须有空了就练一练哈。

# 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设计模式---创建型之单例模式的更多相关文章

  1. Python设计模式 - 创建型 - 单例模式(Singleton) - 十种

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

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

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

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

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

  4. [Python编程实战] 第一章 python的创建型设计模式1.1抽象工厂模式

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

  5. 设计模式01 创建型模式 - 单例模式(Singleton Pattern)

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

  6. C# 设计模式·创建型模式

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

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

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

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

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

  9. [19/04/22-星期一] GOF23_创建型模式(单例模式)

    一.概念 <Design Patterns: Elements of Reusable Object-Oriented Software>(即后述<设计模式>一书),由 Eri ...

随机推荐

  1. Kafka-python 客户端导致的 cpu 使用过高,且无法消费消息的问题

    今天遇到一个情况使用了 Kafka-python 1.3.3 来操作读取 broker 1.0.1 版本的 kafka.出现了 rebalance 之后分配到了客户端,但是 cpu 利用率很高且无法消 ...

  2. git 回退各种场景操作

    在git的一般使用中,如果发现错误的将不想提交的文件add进入index之后,想回退取消,则可以使用命令:git reset HEAD <file>...,同时git add完毕之后,gi ...

  3. [BJOI2019]勘破神机

    [BJOI2019]勘破神机 推式子好题 m=2,斐波那契数列,$f_{n+1}$项 不妨$++l,++r$,直接求$f_n$ 求$\sum C(f_n,k)$,下降幂转化成阶乘幂,这样都是多项式了, ...

  4. react-native命令行打包APK报错

    我是根据react-native官网进行的react-native打包APK 我的步骤为 第一步就是生成密钥 第二步就是将密钥拷入 第三步:在\android\gradle.properties写入 ...

  5. mysql 单列无重复

    ALTER TABLE jeesite.bb_bill ADD UNIQUE (object_id);

  6. LINQ To SQL 语法及实例大全【转】

    转http://blog.csdn.net/pan_junbiao/article/details/7015633 LINQ to SQL语句(1)之Where Where操作 适用场景:实现过滤,查 ...

  7. CMS收集器和G1收集器优缺点

    首先要知道 Stop the world的含义(网易面试):不管选择哪种GC算法,stop-the-world都是不可避免的.Stop-the-world意味着从应用中停下来并进入到GC执行过程中去. ...

  8. css长度单位学习(em,rem,px,vw,vh)

    绝对长度单位 绝对长度单位代表一个物理测量 [像素px(pixels)] 像素,为影像显示的基本单位,译自英文"pixel",pix是英语单词picture的常用简写,加上英语单词 ...

  9. CSS margin负值学习及实际应用

    前言 margin属性在实际中非常常用,也是平时踩坑较多的地方.margin折叠部分相信不少人都因为这样那样的原因中过招.margin负值也是很常用的功能,很多特殊的布局方法都依赖于它. 表现 虽然m ...

  10. C#windows服务调试技巧

    1.创建项目 2.为了方便调试,设置为控制台程序 3.修改Service1代码 4.修改Main代码 这样当使用-console方式启动时,就是以普通的控制台方式启动,方便调试程序. 5.其它安装之类 ...