aa

# -*- coding: UTF-8 -*-
descr = 'Python 设计模式之 抽象工厂'
import random
import abc


class AbstractDog(object):
    __metaclass__ = abc.ABCMeta


    @abc.abstractmethod
    def speak(self): pass

    @abc.abstractmethod
    def __str__(self): pass


    def _set_name_(self, name):
        return 'never see this'

    def _get_name_(self):
        pass

    name = property(_get_name_, _set_name_)


class USDog(AbstractDog):

    def speak(self):
        return 'wowo, my name is %s' % self.name

    def _set_name_(self, name):
        self._name = 'us dog %s' % name

    def _get_name_(self):
        return self._name

    name = property(_get_name_, _set_name_, doc="name")

    def __str__(self):
        return 'us dog %s' % self.name


class JPDog(AbstractDog):

    def speak(self):
        return '汪王, 我的名字是 %s' % self.name

    def _set_name_(self, name):
        self._name = '日本狗  %s' % name

    def _get_name_(self):
        return self._name

    name = property(_get_name_, _set_name_, doc="名字")

    def __str__(self):
        return '日本狗%s' % self.name


class AbstractCat(object):
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def speak(self): pass

    @abc.abstractmethod
    def __str__(self): pass

    def __set_name(self, name):
        pass

    def __get_name(self):
        pass


class JPCat(AbstractDog):

    def speak(self):
        return '喵喵, 我的名字是 %s' % self.name

    def _set_name_(self, name):
        self._name = '日本猫  %s' % name

    def _get_name_(self):
        return self._name

    name = property(_get_name_, _set_name_, doc="名字")

    def __str__(self):
        return '日本猫%s' % self.name


class USCat(AbstractDog):

    def speak(self):
        return 'miaomiao, my name is  %s' % self.name

    def _set_name_(self, name):
        self._name = 'us cat %s' % name

    def _get_name_(self):
        return self._name

    name = property(_get_name_, _set_name_, doc="name")

    def __str__(self):
        return 'us cat %s' % self.name


class AbstractFactory(object):
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def createCat(self): pass

    @abc.abstractmethod
    def createDog(self): pass


class USFactory(AbstractFactory):
    def createCat(self):
        cat = USCat()
        cat.name = 'Amy'
        return cat

    def createDog(self):
        dog = USDog()
        dog.name = 'Jame'
        return dog

class JPFactory(AbstractFactory):
    def createCat(self):
        cat = JPCat()
        cat.name = '小葵'
        return cat

    def createDog(self):
        dog = JPDog()
        dog.name = '黎明'
        return dog


class PetShop(object):
    def __init__(self, factory=None):
        self.pet_factory = factory

    def show_pet(self):
        cat = self.pet_factory.createCat()
        print(' -*- ' * 10)
        print( cat)
        print('它的名字是 %s' % cat.name)
        print('给客人叫一个 %s' % cat.speak())
        print(' -*- ' * 10)
        print('\n')
        dog = self.pet_factory.createDog()
        print(' -*- ' * 10)
        print(dog)
        print('它的名字是 %s' % dog.name)
        print('给客人叫一个 %s' % dog.speak())
        print(' -*- ' * 10)

# client 部分


def get_factory():
    return random.choice([USFactory,JPFactory])()


if __name__ == '__main__':
    pet_shop = PetShop()
    for i in range(1):
        pet_shop.pet_factory = get_factory()
        pet_shop.show_pet()

你可能感兴趣的:(python学习)