Ai
1 Star 3 Fork 6

DivingKitten/PyDesignPattern

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
ObjectPool.py 7.64 KB
一键复制 编辑 原始数据 按行查看 历史
Spencer.Luo 提交于 2018-10-28 10:15 +08:00 . Modify ObjectPool
#!/usr/bin/python
# Authoer: Spencer.Luo
# Date: 5/27/2018
# Version 1.0
#=======================================================================================================================
# class PowerBank:
# """移动电源"""
#
# def __init__(self, serialNum, electricQuantity):
# self.__serialNum = serialNum
# self.__electricQuantity = electricQuantity
# self.__user = ""
#
# def getSerialNum(self):
# return self.__serialNum
#
# def getElectricQuantity(self):
# return self.__electricQuantity
#
# def setUser(self, user):
# self.__user = user
#
# def getUser(self):
# return self.__user
#
# def showInfo(self):
# print("序列号:%s 电量:%d%% 使用者:%s" % (self.__serialNum, self.__electricQuantity, self.__user) )
class ObjectPack:
"""对象的包装类
封装指定的对象(如充电宝)是否被使用中"""
def __init__(self, obj, inUsing = False):
self.__obj = obj
self.__inUsing = inUsing
def inUsing(self):
return self.__inUsing
def setUsing(self, isUsing):
self.__inUsing = isUsing
def getObj(self):
return self.__obj
class PowerBankBox:
"""存放移动电源的智能箱盒"""
def __init__(self):
self.__pools = {}
self.__pools["0001"] = ObjectPack(PowerBank("0001", 100))
self.__pools["0002"] = ObjectPack(PowerBank("0002", 100))
def borrow(self, serialNum):
"""借用移动电源"""
item = self.__pools.get(serialNum)
result = None
if(item is None):
print("没有可用的电源!")
elif(not item.inUsing()):
item.setUsing(True)
result = item.getObj()
else:
print("%s电源 已被借用!" % serialNum)
return result
def giveBack(self, serialNum):
"""归还移动电源"""
item = self.__pools.get(serialNum)
if(item is not None):
item.setUsing(False)
print("%s电源 已归还!" % serialNum)
# Version 2.0
#=======================================================================================================================
# 代码框架
#==============================
from abc import ABCMeta, abstractmethod
# 引入ABCMeta和abstractmethod来定义抽象类和抽象方法
import logging
# 引入logging模块用于输出日志信息
import time
# 引入时间模块
logging.basicConfig(level=logging.INFO)
# 如果想在控制台打印INFO以上的信息,则加上此配制
class PooledObject:
"""池对象,也称池化对象"""
def __init__(self, obj):
self.__obj = obj
self.__busy = False
def getObject(self):
return self.__obj
def setObject(self, obj):
self.__obj = obj
def isBusy(self):
return self.__busy
def setBusy(self, busy):
self.__busy = busy
class ObjectPool(metaclass=ABCMeta):
"""对象池"""
"""对象池初始化大小"""
InitialNumOfObjects = 10
"""对象池最大的大小"""
MaxNumOfObjects = 50
def __init__(self):
self.__pools = []
for i in range(0, ObjectPool.InitialNumOfObjects):
obj = self.createPooledObject()
self.__pools.append(obj)
@abstractmethod
def createPooledObject(self):
"""创建池对象, 由子类实现该方法"""
pass
def borrowObject(self):
"""借用对象"""
# 如果找到空闲对象,直接返回
obj = self._findFreeObject()
if(obj is not None):
logging.info("%x对象已被借用, time:%s", id(obj),
time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time())) )
return obj
# 如果对象池未满,则添加新的对象
if(len(self.__pools) < ObjectPool.MaxNumOfObjects):
pooledObj = self.addObject()
if (pooledObj is not None):
pooledObj.setBusy(True)
logging.info("%x对象已被借用, time:%s", id(obj),
time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time())))
return pooledObj.getObject()
# 对象池已满且没有空闲对象,则返回None
return None
def returnObject(self, obj):
"""归还对象"""
for pooledObj in self.__pools:
if(pooledObj.getObject() == obj):
pooledObj.setBusy(False)
logging.info("%x对象已归还, time:%s", id(obj),
time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time())))
break
def addObject(self):
"""添加新对象"""
obj = None
if(len(self.__pools) < ObjectPool.MaxNumOfObjects):
obj = self.createPooledObject()
self.__pools.append(obj)
logging.info("添加新对象%x, time:", id(obj),
time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time())))
return obj
def clear(self):
"""清空对象池"""
self.__pools.clear()
def _findFreeObject(self):
"""查找空闲的对象"""
obj = None
for pooledObj in self.__pools:
if(not pooledObj.isBusy()):
obj = pooledObj.getObject()
pooledObj.setBusy(True)
break
return obj
# 基于框架的实现
#==============================
class PowerBank:
"""移动电源"""
def __init__(self, serialNum, electricQuantity):
self.__serialNum = serialNum
self.__electricQuantity = electricQuantity
self.__user = ""
def getSerialNum(self):
return self.__serialNum
def getElectricQuantity(self):
return self.__electricQuantity
def setUser(self, user):
self.__user = user
def getUser(self):
return self.__user
def showInfo(self):
print("序列号:%03d 电量:%d%% 使用者:%s" % (self.__serialNum, self.__electricQuantity, self.__user))
class PowerBankPool(ObjectPool):
"""存放移动电源的智能箱盒"""
__serialNum = 0
@classmethod
def getSerialNum(cls):
cls.__serialNum += 1
return cls.__serialNum
def createPooledObject(self):
powerBank = PowerBank(PowerBankPool.getSerialNum(), 100)
return PooledObject(powerBank)
# Test
#=======================================================================================================================
def testPowerBank():
box = PowerBankBox()
powerBank1 = box.borrow("0001")
if(powerBank1 is not None):
powerBank1.setUser("Tony")
powerBank1.showInfo()
powerBank2 = box.borrow("0002")
if(powerBank2 is not None):
powerBank2.setUser("Sam")
powerBank2.showInfo()
powerBank3 = box.borrow("0001")
box.giveBack("0001")
powerBank3 = box.borrow("0001")
if(powerBank3 is not None):
powerBank3.setUser("Aimee")
powerBank3.showInfo()
def testObjectPool():
powerBankPool = PowerBankPool()
powerBank1 = powerBankPool.borrowObject()
if (powerBank1 is not None):
powerBank1.setUser("Tony")
powerBank1.showInfo()
powerBank2 = powerBankPool.borrowObject()
if (powerBank2 is not None):
powerBank2.setUser("Sam")
powerBank2.showInfo()
powerBankPool.returnObject(powerBank1)
# powerBank1归还后,不能再对其进行相关操作
powerBank3 = powerBankPool.borrowObject()
if (powerBank3 is not None):
powerBank3.setUser("Aimee")
powerBank3.showInfo()
powerBankPool.returnObject(powerBank2)
powerBankPool.returnObject(powerBank3)
powerBankPool.clear()
# testPowerBank()
testObjectPool()
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/divingkitten/PyDesignPattern.git
git@gitee.com:divingkitten/PyDesignPattern.git
divingkitten
PyDesignPattern
PyDesignPattern
master

搜索帮助