2. 工廠模式
工廠模式是創建型設計模式的一種。核心的思想是,通過傳遞給類或函數某種產品的信息來創建產品並返回。當我們想得到產品a對象,只需把產品a的名字傳遞給工廠函數就能得到產品a對象。而核心思想的背後是爲了遵循著名的“開閉原則”:對擴展開放,對修改封閉。當添加新功能時,對已經有的函數代碼不需要修改,只需要添加新功能相關的代碼即可。
2.1 簡單工廠模式
簡單工廠模式,是最簡單的工廠方法模式,其由兩部分組成,一是:工廠函數或工廠類,二是:產品類(可以是多個產品類A,B,C.........)。
下面我們通過一個簡單的例子來看什麼是簡單工廠模式:
class A(object): def __init__(self, product_type): self.product_type = product_type def __str__(self): return 'product %s' % self.product_type class B(object): def __init__(self, product_type): self.product_type = product_type def __str__(self): return 'product %s' % self.product_type class Factory(object): @staticmethod def yield_product(product_type): if product_type == 'A': return A(product_type) if product_type == 'B': return B(product_type) if __name__ == '__main__': a = Factory.yield_product('A') b = Factory.yield_product('B') print(a) print(b)
結果如下
product A
product B
上面代碼中,實現了兩個產品類A,B,一個工廠類Factory,工廠類中實現了一個靜態方法,其實,可以用一個工廠函數來代替這個工廠類。靜態方法可以通過類名進行調用,而不需把類實例化。
靜態方法@staticmethod的意思是,這個方法是一個普通方法,雖然屬於類,但是不用訪問類的其他成員。並且可以在不把類實例化的前提下,通過類名進行調用。
2.2 工廠方法模式
簡單工廠模式存在一個問題,當要增加產品時,需要修改工廠類或者工廠方法,在上面的例子中,我們需要修改工廠類的方法"yield_product"這違背了擴展開放,修改封閉的原則,因此是不可取的。工廠方法模式能夠實現最小化地修改工廠類或工廠函數。
具體實現:對每一個產品類再進行一次封裝,封裝成只生產特定產品的工廠類。
import abc class A(object): def __init__(self, product_type): self.product_type = product_type def __str__(self): return 'product %s' % self.product_type class B(object): def __init__(self, product_type): self.product_type = product_type def __str__(self): return 'product %s' % self.product_type class Abstract_factory(object): __metaclass__ = abc.ABCMeta @abc.abstractmethod def yield_product(self): pass class Factory_a(Abstract_factory): def yield_product(self): return A('A') class Factory_b(Abstract_factory): def yield_product(self): return B('B') def factory(product_type): if product_type == 'A': return Factory_a() if product_type == 'B': return Factory_b() if __name__ == '__main__': factory_a = factory('A') a = factory_a.yield_product() factory_b = factory('B') b = factory_b.yield_product() print(a) print(b)
結果如下
product A
product B
上述代碼,Factory_a,Factory_b是對類A,B的封裝,一個工廠只負責創建一個產品遵從了單一職責原則,有利於代碼的擴展和維護。
其中@abc.abstractmethod表示被該裝飾器修飾的方法是一個抽象方法,沒有實現,所以該基本不能被實例化。只有子類實現了該抽象方法才能被實例化。
參考鏈接:
1. python 設計模式(三) 工廠模式 https://blog.csdn.net/ruguowoshiyu/article/details/80657052
2. Python中的staticmethod與classmethod
3. python中@classmethod @staticmethod區別
4. Python2和Python3中@abstractmethod的用法 https://blog.csdn.net/xiemanR/article/details/72629164