設計模式之工廠模式與策略模式

  關於簡單工廠模式、工廠方法模式、抽象工廠模式這三種設計模式網上有不少資料,這裏不詳細說明他們只給出定義.html

  簡單工廠模式(Simple Factory Pattern):又稱爲靜態工廠方法(Static Factory Method)模式,它屬於類建立型模式。在簡單工廠模式中,能夠根據參數的不一樣返回不一樣類的實例。簡單工廠模式專門定義一個類來負責建立其餘類的實例,被建立的實例一般都具備共同的父類。python

  工廠方法模式(Factory Method Pattern)又稱爲工廠模式,也叫虛擬構造器(Virtual Constructor)模式或者多態工廠(Polymorphic Factory)模式,它屬於類建立型模式。在工廠方法模式中,工廠父類負責定義建立產品對象的公共接口,而工廠子類則負責生成具體的產品對象,這樣作的目的是將產品類的實例化操做延遲到工廠子類中完成,即經過工廠子類來肯定究竟應該實例化哪個具體產品類。算法

  抽象工廠模式(Abstract Factory Pattern):提供一個建立一系列相關或相互依賴對象的接口,而無須指定它們具體的類。抽象工廠模式又稱爲Kit模式,屬於對象建立型模式。設計模式

  工廠就是用於生產產品(也就是建立實例),當咱們只有一種產品時咱們實際上是不須要工廠的,只有在有多種類型的產品的時候才須要工廠來幫咱們選擇特定的類去實例化。通常的簡單使用場景,簡單工廠模式足以應付。當咱們須要對一組產品同時初始化,而且每一個產品都有多種類型的時候,就須要抽象工廠模式來應付了.這三者模式的抽象封裝程度依次遞增,能夠認爲抽象工廠模式就是返回了工廠的工廠模式.設計

  策略模式跟工廠模式有時候看起來很像,尤爲是策略模式與簡單工廠模式.htm

先分別看看策略模式與簡單工廠模式的代碼:對象

  策略模式blog

class Duck(object):
    def __init__(self, strategy=None):
        self.action = None
        if strategy:
            self.action = strategy()

    def fly(self, kind):
        if self.action:
            return self.action.fly(kind, self)
        else:
            raise UnboundLocalError('Exception raised, no strategyClass supplied to Duck!')

class Duck1(object):
    def fly(self, kind, instance):
        return 'Duck1 fly kind: ' + kind + '#' + str(instance.count)

class Duck2(object):
    def fly(self, kind, instance):
        return 'Duck2 fly kind: ' + kind + '#' + str(instance.count)

if __name__ == '__main__':
    duckfly = Duck()
    duck1fly = Duck(strategy=Duck1)
    duck2fly = Duck(strategy=Duck2)

    try:
        print(duckfly.fly('yes'))
    except Exception as e:
        print("The following exception was expected:")

    print(duck1fly.fly('yes')) 
    print(duck1fly.fly('no'))
    print(duck1fly.fly('yes'))
    print(duck2fly.fly('yes'))
    print(duck2fly.fly('no'))

簡單工廠模式來實現上面的代碼大體以下接口

class Duck(object):
    def fly(self, kind):
        raise NotImplementedError()


class Duck1(Duck):
    def fly(self, kind):
        return 'Duck1 fly kind: ' + kind 


class Duck2(Duck):
    def fly(self, kind):
        return 'Duck2 fly kind: ' + kind 


class DuckFactory(object):

    @staticmethod
    def create_duck(self, type):
        duckmap = dict(duck1=Duck1, duck2=Duck2)
        return duckmap[type]()

if __name__ == '__main__':
    duck1fly = DuckFactory.create_duck('duck1')
    duck2fly = DuckFactory.create_duck('duck2')

    print(duck1fly.fly('yes'))
    print(duck1fly.fly('no'))
    print(duck2fly.fly('yes'))
    print(duck2fly.fly('no'))

  策略模式屬於行爲模式,策略模式中的算法是用來解決同一個問題的,根據時間、條件不一樣,算法的具體細節有差別,但最終解決的是同一個問題。在需求分析過程當中,當聽到須要在不一樣時間應用不一樣的業務規則,就能夠考慮使用策略模式來處理這種變化的可能性。簡單工廠模式專門定義一個類來負責建立其餘類的實例,被建立的實例一般都具備共同的父類。get

  不少時候策略模式會和工廠模式結合起來使用.

相關文章
相關標籤/搜索