【编程思想】【设计模式】【创建模式creational】抽象工厂模式abstract_factory
Python版
https://github.com/faif/python-patterns/blob/master/creational/abstract_factory.py
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#!/usr/bin/env python # -*- coding: utf-8 -*- """ *What is this pattern about? In Java and other languages, the Abstract Factory Pattern serves to provide an interface for creating related/dependent objects without need to specify their actual class. >>在Java和其他语言中,抽象工厂模式为创建相关联的对象提供借口,而不用制定他们的实体类 The idea is to abstract the creation of objects depending on business logic, platform choice, etc. >>这是为了抽象创建基于业务逻辑和用户选择而创建的 In Python, the interface we use is simply a callable, which is "builtin" interface in Python, and in normal circumstances we can simply use the class itself as that callable, because classes are first class objects in Python. >>在python中,我们使用的接口是可调用的,是一个可创建的借口 >>在python中,通常情况下,我们只使用类本身作为可调用的接口,因为类是第一个对象 *What does this example do? This particular implementation abstracts the creation of a pet and does so depending on the factory we chose (Dog or Cat, or random_animal) This works because both Dog/Cat and random_animal respect a common interface (callable for creation and .speak()). >>这个抽象的实现了创造一个宠物,然后基于我们选择的工厂类型(狗或者猫或者其他随意的动物) >>这个可以实现因为猫,狗或者其他的动物都遵照这个接口(可调用创造和说话) Now my application can create pets abstractly and decide later, based on my own criteria, dogs over cats. >>现在我的应用可以抽象创造宠物然后再根据我个人的准早来创造狗,而不是猫 *Where is the pattern used practically? *References: https://sourcemaking.com/design_patterns/abstract_factory http://ginstrom.com/scribbles/2007/10/08/design-patterns-python-style/ *TL;DR80 Provides a way to encapsulate a group of individual factories. """ 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() print("We have a lovely {}".format(pet)) print("It says {}".format(pet.speak())) 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" # Additional factories: # Create a random animal def random_animal(): """Let's be dynamic!""" return random.choice([Dog, Cat])() # Show pets with various factories if __name__ == "__main__": # A Shop that sells only cats cat_shop = PetShop(Cat) cat_shop.show_pet() print("") # A shop that sells random animals shop = PetShop(random_animal) for i in range(3): shop.show_pet() print("=" * 20) ### OUTPUT ### # We have a lovely Cat # It says meow # # We have a lovely Dog # It says woof # ==================== # We have a lovely Cat # It says meow # ==================== # We have a lovely Cat # It says meow # ====================