1. 程式人生 > 其它 >Python實現工廠模式的兩個例子

Python實現工廠模式的兩個例子

設計模式在Java裡面這個是必須的中高階內容。而很少看到Python裡面刻意去講這個,關於Python實現的設計模式,一直以來是自己比較好奇而且想深入學習的一個點。

需要吐槽的是自己買了本紙質書,按照書名是可以精通Python設計模式了,裡面有流程圖,有程式碼,部分還有例子和執行結果。但是自己看起來總是感覺有些吃力,不是完全技術層面的困難,而是理解上的困難。

而換個思路,看看國內的一些朋友寫的一些設計模式的總結,一看就懂。我都納悶是不是文化上的差異導致的。

這個比較清晰。可以關注下。

https://github.com/w392807287/Design_pattern_of_python

這個的star都超過14000個了。

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

我們先來簡單看下工廠模式

如下是工廠方法的實現,裡面用到了字典來做鍵值的對映。

#!/usr/bin/python
# coding:utf8
'''
Factory Method
'''


class ChinaGetter:
    """A simple localizer a la gettext"""

    def __init__(self):
        self.trans = dict(jianrong=u"楊建榮", jianrong_notes=u"學習筆記")

    def get(self, msgid):
        """We'll punt if we don't have a translation"""
        try:
            return self.trans[msgid]
        except KeyError:
            return str(msgid)


class EnglishGetter:
    """Simply echoes the msg ids"""
    def __init__(self):
        self.trans = dict(jeanron100=u"jeanron100...", mysql=u"MySQL", oracle=u"Oracle")

    def get(self, msgid):
        try:
            return self.trans[msgid]
        except KeyError:
            return str(msgid)


def get_localizer(language="English"):
    """The factory method"""
    languages = dict(English=EnglishGetter, China=ChinaGetter)
    return languages[language]()


# Create our localizers
e, g = get_localizer("English"), get_localizer("China")
# Localize some text
for msgid in "jeanron100 jianrong mysql oracle".split():
    print(e.get(msgid), g.get(msgid))

執行結果如下:

(u'jeanron100...', 'jeanron100')

('jianrong', u'u6768u5efau8363')

(u'MySQL', 'mysql')

(u'Oracle', 'oracle')

而使用抽象工廠,使用了random來做一個動態匹配。這個例子參考了開篇的第一個連結的例子,裡面的getFactory方法會隨機得到一個工廠的例項化物件,而對於應用來說這個匹配的過程是透明的。

#!/usr/bin/python
# coding:utf8
'''
Abstract Factory
'''

import random


class PetShop:
    """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("This is a lovely", str(pet))
        print("It says", pet.speak())
        print("It eats", self.pet_factory.get_food())


# Stuff that our factory makes

class Dog:
    def speak(self):
        return "woof"

    def __str__(self):
        return "Dog"


class Cat:
    def speak(self):
        return "meow"

    def __str__(self):
        return "Cat"


# Factory classes

class DogFactory:
    def get_pet(self):
        return Dog()

    def get_food(self):
        return "dog food"


class CatFactory:
    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])()


# Show pets with various factories
if __name__ == "__main__":
    shop = PetShop()
    for i in range(3):
        shop.pet_factory = get_factory()
        shop.show_pet()
        print("=" * 20)
    #print random.choice([1,2,3,4,5])

執行結果如下:

('This is a lovely', 'Cat')
('It says', 'meow')
('It eats', 'cat food')
====================
('This is a lovely', 'Cat')
('It says', 'meow')
('It eats', 'cat food')
====================
('This is a lovely', 'Dog')
('It says', 'woof')
('It eats', 'dog food')
====================

有了這些鋪墊,對於Python設計模式的實現就有了一個初步的認識和理解,後續做一些改進就可以循序漸進了。