您的位置:首页 > 其它

设计模式----抽象工厂模式

2014-06-06 20:58 169 查看
<pre name="code" class="python">#武器工厂
#抽象工厂模式
'''抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。根据LSP原则,任何接受父类型的地方,都应当能够接受子类型。因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例。换言之,也就是这些抽象产品的具体子类的实例。工厂类负责创建抽象产品的具体子类的实例。'''
'''武器工厂生产武器的实例,不同属性的工厂生产不同属性的武器,武器的攻击可
以设定,工厂需添加相应武器的类才能生产实例'''
class WeaponFactory(object):
'''This is an abstract class WeaponFactory'''

def __init__(self,weapon = None):
self.weapons = {weapon.__name__ : weapon}

def createweapon(self,name,attack):
pass

def addweapon(self,weapon):
if self.weapons.has_key(weapon.__name__):
raise KeyError("we have had this weapon")
self.weapons[weapon.__name__] = weapon

def removeweapon(self,name):
if not self.weapons.has_key(name):
raise KeyError("we don't have this weapon")
self.weapons.pop(name)

class FireWeaponFactory(WeaponFactory):
'''This is a concreate class FireWeaponFactory'''
def __init__(self,weapon = None):
self.position = 'Fire'
WeaponFactory.__init__(self,weapon)

def createweapon(self,name,attack = 0):
if not self.weapons.has_key(name):
raise KeyError("we don't have this weapon")
return self.weapons[name](attack,self.position)

class WaterWeaponFactory(WeaponFactory):
'''This is a concreate class WaterWeaponFactory'''
def __init__(self,weapon = None):
self.position = 'Water'
WeaponFactory.__init__(self,weapon)

def createweapon(self,name,attack):
if not self.weapons.has_key(name):
raise KeyError("we don't have this weapon")
return self.weapons[name](attack,self.position)

class Weapon(object):
'''This is an abstract class Weapon'''
def __init__(self,attack = 0,position = None):
self._attack = attack
self._position = position

@property
def attack(self):
return self._attack
@attack.setter
def attack(self,value):
raise ValueError("you can't set attack")
@attack.deleter
def attack(self):
raise AttributeError("you can't delete attack")

@property
def position(self):
return self._position
@position.setter
def position(self,value):
raise ValueError("you can't set position")
@position.deleter
def position(self):
raise AttributeError("you can't delete position")

class Bow(Weapon):
'''a class Bow'''
def __str__(self):
return Bow.__name__

class Sword(Weapon):
'''a class Sword'''
def __str__(self):
return Sword.__name__

class Gun(Weapon):
'''a class Gun'''
def __str__(self):
return Gun.__name__

if __name__ == '__main__':
mf = FireWeaponFactory(Bow)
mbow = mf.createweapon('Bow',120)
mf.addweapon(Sword)
msword = mf.createweapon('Sword',170)
mw = WaterWeaponFactory(Bow)
ybow = mw.createweapon('Bow',190)
#mf.removeweapon('Sword')
print mbow.attack
print mbow.position
print '--'*30
print msword.attack
print msword.position
print '--'*30
print ybow.attack
print ybow.position
print '--'*30
print mf.createweapon('Sword',210)



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: