抽象工厂模式

2017-07-07  本文已影响11人  nummycode

抽象工厂模式为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。

当每个抽象产品都有多于一个的具体子类的时候,工厂角色怎么知道实例化哪一个子类呢?比如每个抽象产品角色都有两个具体产品。抽象工厂模式提供两个具体工厂角色,分别对应于这两个具体产品角色,每一个具体工厂角色只负责某一个产品角色的实例化。每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例。

每一个模式都是针对一定问题的解决方案,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式针对的是多个产品等级结构。

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()

上一篇下一篇

猜你喜欢

热点阅读