Python版

https://github.com/faif/python-patterns/blob/master/creational/borg.py

#!/usr/bin/env python
# -*- coding: utf-8 -*- """
*What is this pattern about?
The Borg pattern (also known as the Monostate pattern) is a way to
implement singleton behavior, but instead of having only one instance
of a class, there are multiple instances that share the same state. In
other words, the focus is on sharing state instead of sharing instance
identity.
>>Borg设计模式(我们通常叫它Monostate模式)是一个用来实现单例的行为,
>>但是它不是一个类只有一个实例,它有很多实例共享相同的状态。
>>换句话说,它专注在共享状态而不是共享实例 *What does this example do?
To understand the implementation of this pattern in Python, it is
important to know that, in Python, instance attributes are stored in a
attribute dictionary called __dict__.
>>为了弄明白这个设计模式在python中的实现,我们必须要知道,
>>在python中,实例的属性是存储在一个属性字典中,叫做__dict__
Usually, each instance will have
its own dictionary, but the Borg pattern modifies this so that all
instances have the same dictionary.
>>通常来说,每个实例都有它自己的字典,但是Borg模式修改了他
>>所以所有实例都有相同的字典
In this example, the __shared_state attribute will be the dictionary
shared between all instances, and this is ensured by assigining
__shared_state to the __dict__ variable when initializing a new
instance (i.e., in the __init__ method).
>>在这个例子中,属性__shared_state作为字典被所有实例共享,
>>这就确保了在初始化一个实例的时候(例如 __init__方法),
Other attributes are usually
added to the instance's attribute dictionary, but, since the attribute
dictionary itself is shared (which is __shared_state), all other
attributes will also be shared.
>>其他的属性其他属性经常被添加到实例属性字典,但是,因为属性字典本身是被共享的
>>(__shared_state),所以所有其他的属性也是被共享的
For this reason, when the attribute self.state is modified using
instance rm2, the value of self.state in instance rm1 also chages. The
same happends if self.state is modified using rm3, which is an
instance from a subclass.
>>因为这个原因,但是属性self.state被实例rm2修改之后,rm1中self.state的值也改变了
>>如果子类的实例rm3修改了self.state也会发生相同的事情
Notice that even though they share attributes, the instances are not
the same, as seen by their ids.
>>注意,即使他们共享属性,实例也是不一样的,从他们的id就能看出来 *Where is the pattern used practically?
Sharing state is useful in applications like managing database connections:
>>共享属性在管理数据库连接的应用中非常实用
https://github.com/onetwopunch/pythonDbTemplate/blob/master/database.py *References:
https://fkromer.github.io/python-pattern-references/design/#singleton *TL;DR80
Provides singletone-like behavior sharing state between instances.
""" class Borg(object):
__shared_state = {} def __init__(self):
self.__dict__ = self.__shared_state
self.state = 'Init' def __str__(self):
return self.state class YourBorg(Borg):
pass if __name__ == '__main__':
rm1 = Borg()
rm2 = Borg() rm1.state = 'Idle'
rm2.state = 'Running' print('rm1: {0}'.format(rm1))
print('rm2: {0}'.format(rm2)) rm2.state = 'Zombie' print('rm1: {0}'.format(rm1))
print('rm2: {0}'.format(rm2)) print('rm1 id: {0}'.format(id(rm1)))
print('rm2 id: {0}'.format(id(rm2))) rm3 = YourBorg() print('rm1: {0}'.format(rm1))
print('rm2: {0}'.format(rm2))
print('rm3: {0}'.format(rm3)) ### OUTPUT ###
# rm1: Running
# rm2: Running
# rm1: Zombie
# rm2: Zombie
# rm1 id: 140732837899224
# rm2 id: 140732837899296
# rm1: Init
# rm2: Init
# rm3: Init

Python转载版

【编程思想】【设计模式】【创建模式creational】Borg/Monostate的更多相关文章

  1. 【编程思想】【设计模式】【创建模式creational 】工厂模式factory_method

    Python版 https://github.com/faif/python-patterns/blob/master/creational/factory_method.py #!/usr/bin/ ...

  2. 【编程思想】【设计模式】【创建模式creational】Pool

    Python版 https://github.com/faif/python-patterns/blob/master/creational/pool.py #!/usr/bin/env python ...

  3. 【编程思想】【设计模式】【创建模式creational】抽象工厂模式abstract_factory

    Python版 https://github.com/faif/python-patterns/blob/master/creational/abstract_factory.py #!/usr/bi ...

  4. 【编程思想】【设计模式】【创建模式creational】建造者模式builder

    Python版 https://github.com/faif/python-patterns/blob/master/creational/builder.py #!/usr/bin/python ...

  5. 【编程思想】【设计模式】【创建模式creational】原形模式Prototype

    Python版 https://github.com/faif/python-patterns/blob/master/creational/prototype.py #!/usr/bin/env p ...

  6. 【编程思想】【设计模式】【创建模式creational】lazy_evaluation

    Python版 https://github.com/faif/python-patterns/blob/master/creational/lazy_evaluation.py #!/usr/bin ...

  7. 【java设计模式】【创建模式Creational Pattern】单例模式Singleton Pattern

    //饿汉式:资源利用率较低(无论是否需要都会创建),性能较高(使用前无需判断实例是否存在,可直接使用) public class EagerSingleton{ private static fina ...

  8. 【java设计模式】【创建模式Creational Pattern】抽象工厂模式Abstract Factory Pattern

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAW0AAABvCAIAAACo3AbKAAALvUlEQVR4nO1dUa7cOA7U/c+zwJxkf4

  9. 【java设计模式】【创建模式Creational Pattern】建造模式Builder Pattern

    package com.tn.pattern; public class Client { public static void main(String[] args) { Director dire ...

随机推荐

  1. 庆祝dotnet6,fastgithub送给你

    前言 dotnet6正式发布了,fastgithub是使用dotnet开发的一款github加速器,作为开发者,无人不知github,作为github用户,fastgithub也许是你不可或缺的本机工 ...

  2. 添加su权限

    在root用户下 visudo amy   ALL=(ALL)   NOPASSWD:ALL 在amy用户下 vim ~/.bashrc alias sd = "sudo"

  3. scrapy_电影天堂多页数据和图片下载

    嵌套的 爬取 先获取第一页的标题 点击标题到第二页的图片url 1.创建项目 > scrapy startproject scrapy_movie_099 2.创建爬虫文件 spiders> ...

  4. 时间处理,类似"xxxx-xx-xxTxx:xx:xx187+0000"格式

    后端返回的时间:"2020-04-24T09:12:51.187+0000" 目标显示时间:2020-04-24   09:12:51 <!DOCTYPE html> ...

  5. [atARC111F]Do you like query problems

    (以下修改指1和2类操作,询问指3类操作,操作指修改或询问) 注意到总方案数确定,那么不妨求出答案的期望,再乘上方案数即为答案 (这里从期望的角度考虑只是为了描述方便,并没有太大的实际意义) 设$E( ...

  6. Codeforces 1603D - Artistic Partition(莫反+线段树优化 dp)

    Codeforces 题面传送门 & 洛谷题面传送门 学 whk 时比较无聊开了道题做做发现是道神题( 介绍一种不太一样的做法,不观察出决策单调性也可以做. 首先一个很 trivial 的 o ...

  7. CF1554E You

    考虑到删点操作的实质是指认边的方向. 由于这是一棵树,所以有很好的性质. 我们完全可以以此从树叶开始,往上拓扑进行,按照对某个数的取膜的大小来进行操作. 由此可知,除了 \(1\) 以外,任意 \(2 ...

  8. 洛谷 P4707 - 重返现世(扩展 Min-Max 容斥+背包)

    题面传送门 首先看到这种求形如 \(E(\max(T))\) 的期望题,可以套路地想到 Min-Max 容斥 \(\max(S)=\sum\limits_{T\subseteq S}(-1)^{|T| ...

  9. Parallel NetCDF 简介

    Parallel NetCDF API 所有C接口前加ncmpi前缀,Fortran接口前加nfmpi前缀 函数返回整数 NetCDF 状态变量 1. Variable and Parameter T ...

  10. MetaboAnalyst的多组学分析

    MetaboAnalyst是做代谢的R包,功能十分强大.也开发了web版本,代谢组学的分析这里不介绍,主要讲讲它开发的多组学分析的相关内容. 既然是做代谢的工具,即使是增加了多组学内容,肯定也是以代谢 ...