抽象工厂(abstact_foctory)模式
抽象工厂是什么
抽象工厂是为了提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
例子
我创建了一个抽象工厂类,它的表现取决于我们选择什么工厂来初始化它。例子中,抽象工厂类是宠物店(PetShop),它有一个动作(show_pet)用来展示动物,我们如果用猫(Cat)初始化宠物店,展示时,它会”喵呜“。
代码实现例子
import random
class PetShop(object):
"""宠物店"""
def __init__(self, animal_factory=None):
"""pet_factory是我们的抽象工厂"""
self.pet_factory = animal_factory
def show_pet(self):
"""使用抽象工厂创造和展示宠物"""
pet = self.pet_factory()
print("我们有一只可爱的 {}".format(pet))
print("它看到了你,对你 {}".format(pet.speak()))
class Dog(object):
def speak(self):
return '汪汪'
def __str__(self):
return '小狗'
class Cat(object):
def speak(self):
return '喵呜'
def __str__(self):
return '小猫'
# 随机一种动物
def random_animal():
return random.choice([Dog, Cat])()
if __name__ == "__main__":
cat_shop = PetShop(Cat)
cat_shop.show_pet()
shop = PetShop(random_animal)
for _ in range(3):
shop.show_pet()
print('=' * 20)
### 输出 ###
我们有一只可爱的 小猫
它看到了你,对你 喵呜
我们有一只可爱的 小狗
它看到了你,对你 汪汪
====================
我们有一只可爱的 小猫
它看到了你,对你 喵呜
====================
我们有一只可爱的 小狗
它看到了你,对你 汪汪
====================
Borg(borg)模式
Borg模式是什么
Brog模式(也称Monostata模式)可以用来实现单例,但是不是指一个类只有一个实例,它会多个具有相同属性的实例。换一句话说,它关注于共享属性为不是共享实例。
例子
首先你需要知道的是,Python实例的属性存储在一个叫做__dict__
的字典中。通常,每个实例都会有一个这样的字典,但是,Borg 模式修改了这一规定,从而使每个实例有一个相同的字典。
在这个例子中,__shared_state
属性会成为所有实例的公共字典,这是通过确保当初始化一个新的实例时(__init__()
)方法执行时),将 __dict__
属性赋值为类的静态变量 _shared_state
来实现的。
代码实现例子
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))
### 输出 ###
rm1: Running
rm2: Running
rm1: Zombie
rm2: Zombie
rm1 id: 2306371518816
rm2 id: 2306371552704
rm1: Init
rm2: Init
rm3: Init