from abc import ABC, abstractmethod
class Fruit(ABC):
def __init__(self):
self.name = None
@abstractmethod
def eat(self):
pass
class Apple(Fruit):
def __init__(self):
self.name = "Apple"
def eat(self):
print("emmm, I'm an %s" % self.name)
class Banana(Fruit):
def __init__(self):
self.name = "Banana"
def eat(self):
print("Ouch, you cannot eat a %s" % self.name)
class Orange(Fruit):
def __init__(self):
self.name = "Orange"
def eat(self):
print("I'm an %s and very sour" % self.name)
class FruitFactory(object):
@staticmethod
def getFruit(name):
assert type(name) in [str]
fruit_clss = {
"apple": Apple,
"banana": Banana,
"orange": Orange
}
fruit_cls = fruit_clss.get(name.lower())
if fruit_cls:
return fruit_cls()
else:
raise Exception("I cannot produce the fruit named %r" % name)
if __name__ == "__main__":
fruit = FruitFactory.getFruit('apple')
fruit.eat()