网站搭建多少钱,做网站打广告图片素材,网络推广怎么做效果好,wordpress安装主题之后首页不变1-Python与设计模式–单例模式
一、总线
总线是计算机各种功能部件或者设备之间传送数据、控制信号等信息的公共通信解决方案之一。
现假设有如下场景#xff1a;某中央处理器#xff08;CPU#xff09;通过某种协议总线与一个信号灯相连#xff0c;信号灯有64种颜色可以…1-Python与设计模式–单例模式
一、总线
总线是计算机各种功能部件或者设备之间传送数据、控制信号等信息的公共通信解决方案之一。
现假设有如下场景某中央处理器CPU通过某种协议总线与一个信号灯相连信号灯有64种颜色可以设置
中央处理器上运行着三个线程都可以对这个信号灯进行控制并且可以独立设置该信号灯的颜色。
抽象掉协议细节用打印表示如何实现线程对信号等的控制逻辑。
加线程锁进行控制无疑是最先想到的方法但各个线程对锁的控制无疑加大了模块之间的耦合。
下面我们就用设计模式中的单例模式来解决这个问题。
什么是单例模式单例模式是指保证一个类仅有一个实例并提供一个访问它的全局访问点。
具体到此例中总线对象就是一个单例它仅有一个实例各个线程对总线的访问只有一个全局访问点
即惟一的实例。#encodingutf8
import threading
import time
#这里使用方法__new__来实现单例模式
class Singleton(object):#抽象单例def __new__(cls, *args, **kw):if not hasattr(cls, _instance):orig super(Singleton, cls)cls._instance orig.__new__(cls, *args, **kw)return cls._instance
#总线
class Bus(Singleton):lock threading.RLock()def sendData(self,data):self.lock.acquire()time.sleep(3)print Sending Signal Data...,dataself.lock.release()
#线程对象为更加说明单例的含义这里将Bus对象实例化写在了run里
class VisitEntity(threading.Thread):my_busnamedef getName(self):return self.namedef setName(self, name):self.namenamedef run(self):self.my_busBus()self.my_bus.sendData(self.name)if __name____main__:for i in range(3):print Entity %d begin to run...%imy_entityVisitEntity()my_entity.setName(Entity_str(i))my_entity.start()二、单例模式
单例模式是所有设计模式中比较简单的一类保证某一个类只有一个实例而且在全局只有一个访问点三、单例模式的优点和应用
3.1 单例模式的优点
1、由于单例模式要求在全局内只有一个实例因而可以节省比较多的内存空间
2、全局只有一个接入点可以更好地进行数据同步控制避免多重占用
3、单例可长驻内存减少系统开销。3.2 单例模式的应用举例
1、生成全局惟一的序列号
2、访问全局复用的惟一资源如磁盘、总线等
3、单个对象占用的资源过多如数据库等
4、系统全局统一管理如Windows下的Task Manager
5、网站计数器。3.3 四、单例模式的缺点
1、单例模式的扩展是比较困难的
2、赋于了单例以太多的职责某种程度上违反单一职责原则六大原则后面会讲到;
3、单例模式是并发协作软件模块中需要最先完成的因而其不利于测试
4、单例模式在某种情况下会导致“资源瓶颈”。