Python与设计模式(一)——Abstract Factory
2017-09-19 17:19
274 查看
最近在重新学习Python,想找一些优秀的Python源代码阅读学习,加上前段时间一直在学习设计模式,所以选择了GitHub上这个项目作为学习对象:
https://github.com/faif/python-patterns
这里有用Python实现各个设计模式的源代码demo。
本篇从Abstract Factory开始介绍。
其源码如下:
大家可能会感到奇怪:这里并没有抽象工厂啊?我们可以看这段代码:
# Create the proper family
def get_factory():
"""Let's be dynamic!"""
return random.choice([DogFactory, CatFactory])()
这里,其实就实现了一个抽象工厂的功能,生成目标的factory。DogFactory用来生产Dog对象,CatFactory用来生产Cat对象。Dog类和Cat类都是Pet类的子类。
https://github.com/faif/python-patterns
这里有用Python实现各个设计模式的源代码demo。
本篇从Abstract Factory开始介绍。
其源码如下:
#!/usr/bin/env python # -*- coding: utf-8 -*- # http://ginstrom.com/scribbles/2007/10/08/design-patterns-python-style/ """Implementation of the abstract factory pattern""" import six import abc import random class PetShop(object): """A pet shop""" def __init__(self, animal_factory=None): """pet_factory is our abstract factory. We can set it at will.""" self.pet_factory = animal_factory def show_pet(self): """Creates and shows a pet using the abstract factory""" pet = self.pet_factory.get_pet() print("We have a lovely {}".format(pet)) print("It says {}".format(pet.speak())) print("We also have {}".format(self.pet_factory.get_food())) # Stuff that our factory makes class Dog(object): def speak(self): return "woof" def __str__(self): return "Dog" class Cat(object): def speak(self): return "meow" def __str__(self): return "Cat" # Factory classes class DogFactory(object): def get_pet(self): return Dog() def get_food(self): return "dog food" class CatFactory(object): def get_pet(self): return Cat() def get_food(self): return "cat food" # Create the proper family def get_factory(): """Let's be dynamic!""" return random.choice([DogFactory, CatFactory])() # Implementation 2 of an abstract factory @six.add_metaclass(abc.ABCMeta) class Pet(object): @classmethod def from_name(cls, name): for sub_cls in cls.__subclasses__(): if name == sub_cls.__name__.lower(): return sub_cls() @abc.abstractmethod def speak(self): """""" class Kitty(Pet): def speak(self): return "Miao" class Duck(Pet): def speak(self): return "Quak" # Show pets with various factories if __name__ == "__main__": for i in range(3): shop = PetShop(get_factory()) shop.show_pet() print("=" * 20) for name0 in ["kitty", "duck"]: pet = Pet.from_name(name0) print("{}: {}".format(name0, pet.speak())) ### OUTPUT ### # We have a lovely Cat # It says meow # We also have cat food # ==================== # We have a lovely Dog # It says woof # We also have dog food # ==================== # We have a lovely Cat # It says meow # We also have cat food # ==================== # kitty: Miao # duck: Quak代码对应的类图如下:
大家可能会感到奇怪:这里并没有抽象工厂啊?我们可以看这段代码:
# Create the proper family
def get_factory():
"""Let's be dynamic!"""
return random.choice([DogFactory, CatFactory])()
这里,其实就实现了一个抽象工厂的功能,生成目标的factory。DogFactory用来生产Dog对象,CatFactory用来生产Cat对象。Dog类和Cat类都是Pet类的子类。
相关文章推荐
- python设计模式1:导言
- python设计模式总结
- Python设计模式(二)【适配器模式】
- Python与设计模式--单例模式
- python设计模式1:创建型模式
- Python设计模式-单例模式
- python设计模式(中介者模式)
- 7、python设计模式之策略模式
- 23种设计模式之python实现--Strategy模式
- 23种设计模式之python实现--Iterator模式
- Python中的高级设计模式
- 设计模式-适配器模式-adapter-python
- python设计模式(四)--代理模式(上)
- 设计模式-结构型模式,python桥接模式
- PYTHON设计模式学习(3):Singleton pattern
- [python]设计模式
- Python: 设计模式 之 工厂模式例(1)
- 设计模式-备忘录模式-memento-python??
- python设计模式之单例设计模式
- python设计模式之外观模式