禁白嫖 点赞 转发 适当打赏即可
'''
1.python的工厂模式
1.1 工厂方法模式的定义
工厂函数、工厂类对具体的生成环节进行了封装,这样有利于代码的后需扩展,即把功能划分的更具体,4s店只负责销售,汽车厂只负责制造
创建对象的接口,工厂模式让实例化类对象推迟到子类
销售汽车的4S店提供了创建对象的方法createCar 即工厂方法
子类对象的造车createCar方法创建出具体的产品
创建者类选择使用哪个子类就会决定实际创建的产品
'''
#定义伊兰特汽车类 YLT 的移动和停车方法
class YLT(object):
def move(self):
print('YLT car is moving !!!')
def stop(self):
print('YLT car is stopping !!!')
#定义桑塔纳汽车类 STN 的移动和停车方法
class STN(object):
def move(self):
print('STN car is moving !!!')
def stop(self):
print('STN car is stopping !!!')
#定义基本汽车销售店类 为父类
class carStore(object):
#定义了造车方法 具体在子类中实现
def createCar(self,typeName):
pass
#在汽车销售店里面下单具体的车类
def order(self,typeName):
#让工厂根据类型生产一辆汽车
self.car=self.createCar(typeName)
self.car.move()
self.car.stop()
#定义现代车销售店类 实例化子类对象直接调用父类方法即可
class ModernStore(carStore):
#子类继承父类 实现造车类
def createCar(self,typeName):
self.carFactory=carFactory()
#实现让工厂造车的方法
return self.carFactory.createCar(typeName)
#定义一个汽车工厂类 让他根据具体的订单生产车辆
class carFactory(object):
def createCar(self,typeName):
self.typeName=typeName
if self.typeName=='YLT':
self.car=YLT()
elif typeName=='STN':
self.car=STN()
return self.car
m=ModernStore()
m.order('YLT')
![](https://img.haomeiwen.com/i22651072/f805b9b69dcdabcc.png)
'''
类FrogWorld是一个抽象工厂,其主要职责是创建游戏的主人公和障碍物。
区分创建方法并使其名字通用(比如,make_character()和make_obstacle()),
这让我们可以动态改变当前激活的工厂(也因此改变了当前激活的游戏),
而无需进行任何代码变更。在一门静态语言中,抽象工厂是一个抽象类/接口,
具备一些空方法,但在Python中无需如此,因为类型是在运行时检测的,如下所示
'''
class FrogWorld:
def __init__(self, name):
print(self)
self.player_name =name
def __str__(self):
return '\n\n\t----------Frog World-----------'
def make_character(self):
return Frog(self.player_name)
def make_obstacle(self):
return Bug()
class Wizard:
def __init__(self, name):
self.name =name
def __str__(self):
return self.name
def interact_with(self, obstacle):
print('{} the Wizard battles against {} and {}!'.format(self, obstacle, obstacle.action()))
class Ork:
def __str__(self):
return 'an evil ork'
def action(self):
return 'kills it'
#WizardWorld游戏也类似。在故事中唯一的区别是男巫战怪兽(如兽人)而不是吃虫子!
class WizardWorld:
def __init__(self, name):
print(self)
self.player_name =name
def __str__(self):
return '\n\n\t-------------Wizard World---------------'
def make_character(self):
return Wizard(self.player_name)
def make_obstacle(self):
return Ork()
'''
类GameEnvironment是我们游戏的主入口。它接受factory作为输入,
用其创建游戏的世界。方法play()则会启动hero和obstacle之间的交互,
如下所示。
'''
class GameEnvironment:
def __init__(self, factory):
self.hero =factory.make_character()
self.obstacle =factory.make_obstacle()
def play(self):
self.hero.interact_with(self.obstacle)
'''
函数validate_age()提示用户提供一个有效的年龄。
如果年龄无效,则会返回一个元组,其第一个元素设置为False。
如果年龄没问题,元素的第一个元素则设置为True,
但我们真正关心的是元素的第二个元素,也就是用户提供的年龄,如下所示。
'''
def validate_age(name):
try:
age =input('Welcome {}. How old are you?'.format(name))
age =int(age)
except ValueError as err:
print("Age {} is invalid, please try again...".format(age))
return (False, age)
return (True, age)
'''
最后一个要点是main()函数,该函数请求用户的姓名和年龄,
并根据用户的年龄决定该玩哪个游戏,如下所示。
'''
def main():
name =input("hello, What's your name?")
valid_input =False
while not valid_input:
valid_input, age = validate_age(name)
game = FrogWorldif age <18 else WizardWorld
environment = GameEnvironment(game(name))
environment.play()
main()
![](https://img.haomeiwen.com/i22651072/1745099c25f7350a.png)
网友评论