zoukankan      html  css  js  c++  java
  • 【编程思想】【设计模式】【创建模式creational】抽象工厂模式abstract_factory

    Python版

    https://github.com/faif/python-patterns/blob/master/creational/abstract_factory.py

    #!/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
    # ====================
    Python转载版
  • 相关阅读:
    Java-23,final关键字
    Java-22,抽象类
    Java-21,多态的三个条件
    Java-20,object类之equals方法
    面试题
    平时碰到系统CPU飙高和频繁GC,你会怎么排查?
    django中的FBV和CBV
    flask + celery实现定时任务和异步
    python面试题大全
    Apollo配置中心介绍
  • 原文地址:https://www.cnblogs.com/demonzk/p/9025933.html
Copyright © 2011-2022 走看看