使用工厂函数来完成所有Card对象的创建,在python中,实现工厂有两种途径
- 定义一个函数,返回不同类的对象
- 定义一个类,包含了创建对象的方法。这是完整的工厂设计模式,正如设计模式书中提到的。在工厂类层次结构是必需的
用Card子类对象的一个工厂函数的例子
def Card(rank,suit):
if rank == 1:
return AceCard('A',suit)
elif 2 <= rank < 11:
return NumberCard(str(rank),suit)
elif 11 <= rank < 14:
name = {
11:'J',
12:'Q',
13:'K',}[rank]
return FaceCard(name,suit)
else:
raise Exception("Rank out of range")
这个函数通过传入牌面值rank和花色值suit来创建Card对象这样,这样一来,创建对象的工作更简便了。我们已经把创造对象的过程封装在了单独的工厂函数内,外界无需了解对象层次结构以及多态的工作细节就可以通过调用工厂函数来创建对象。
deck = [card(rank,suit)
for rank in range(1,14)
for suit in (Club,Diamond,Heart,Spade)]