抽象工厂模式为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
当每个抽象产品都有多于一个的具体子类的时候,工厂角色怎么知道实例化哪一个子类呢?比如每个抽象产品角色都有两个具体产品。抽象工厂模式提供两个具体工厂角色,分别对应于这两个具体产品角色,每一个具体工厂角色只负责某一个产品角色的实例化。每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例。
每一个模式都是针对一定问题的解决方案,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式针对的是多个产品等级结构。
import os
import abc
import six
class Animal(six.with_metaclass(abc.ABCMeta, object)):
""" clients only need to know this interface for animals"""
@abc.abstractmethod
def sound(self, ):
pass
class AnimalFactory(six.with_metaclass(abc.ABCMeta, object)):
"""clients only need to know this interface for creating animals"""
@abc.abstractmethod
def create_animal(self,name):
pass
class Dog(Animal):
def __init__(self, name):
self.name = name
def sound(self, ):
print("bark bark")
class DogFactory(AnimalFactory):
def create_animal(self,name):
return Dog(name)
class Cat(Animal):
def __init__(self, name):
self.name = name
def sound(self, ):
print("meow meow")
class CatFactory(AnimalFactory):
def create_animal(self,name):
return Cat(name)
class Animals(object):
def __init__(self,factory):
self.factory = factory
def create_animal(self, name):
return self.factory.create_animal(name)
if __name__ == '__main__':
atype = raw_input("what animal (cat/dog) ?").lower()
if atype == 'cat':
animals = Animals(CatFactory())
elif atype == 'dog':
animals = Animals(DogFactory())
a = animals.create_animal('bulli')
a.sound()