<p>在看了<a href="https://python-3-patterns-idioms-test.readthedocs.io/en/latest/Factory.html" rel="nofollow noreferrer">Bruce Eckel's book</a>之后,我想到了这个:</p>
<pre><code>#Based on Bruce Eckel's book Python 3 example
# A simple static factory method.
from __future__ import generators
import random
from enum import Enum, auto
class ShapeType(Enum):
CIRCLE = auto() # Some circles
SQUARE = auto() # some squares
class Shape(object):
pass
class Circle(Shape):
def draw(self): print("Circle.draw")
def erase(self): print("Circle.erase")
class Square(Shape):
def draw(self): print("Square.draw")
def erase(self): print("Square.erase")
class ShapeFactory(object):
@staticmethod
def create(type):
#return eval(type + "()") # simple alternative
if type in ShapeFactory.choice:
return ShapeFactory.choice[type]()
assert 0, "Bad shape creation: " + type
choice = { ShapeType.CIRCLE: Circle,
ShapeType.SQUARE: Square
}
# Test factory
# Generate shape name strings:
def shapeNameGen(n):
types = list(ShapeType)
for i in range(n):
yield random.choice(types)
shapes = \
[ ShapeFactory.create(i) for i in shapeNameGen(7)]
for shape in shapes:
shape.draw()
shape.erase()
</code></pre>
<p>这将让用户从枚举中选择一个类类型,并阻止任何其他类型。这也意味着用户不太可能写出拼写错误的“坏字符串”。他们只是使用枚举。
然后,测试的输出如下:</p>
^{pr2}$