抽象工廠模式
抽象工廠模式的主要目的是提供一個接口來創建一系列相關對象,而無需指定具體的類。工廠方法將創建實例的任務委託給了子類,而抽象工廠方法的目標是創建一系列相關對象。
實現抽象工廠模式
想象一下,我們開辦了一家披薩店,供應美味的印式和美式披薩。爲此,我們首先創建一個抽象基類——PizzaFactory,PizzaFactory類有兩個抽象方法,即create_vag_piza()和create_non_vag_pizza(),它們需要通過ConcreateFactory實現。在這個例子中,我們創造了兩個具體的工廠,分別名爲IndianPizzaFactory和USPizzaFactory。如下所示:
from abc import ABCMeta, abstractmethod
class PizzaFactory(object):
@abstractmethod
def create_vag_pizza(self):
pass
@abstractmethod
def create_non_var_pizza(self):
pass
class IndianPizzaFactory(PizzaFactory):
def create_vag_pizza(self):
return DeluxeVeggiePizza()
def create_non_var_pizza(self):
return ChickenPizza()
class USPizzaFactory(PizzaFactory):
def create_vag_pizza(self):
return MexicanVegPizza()
def create_non_var_pizza(self):
return HamPizza()
class VegPizza(metaclass=ABCMeta):
@abstractmethod
def prepare(self):
pass
class NonVegPizza(metaclass=ABCMeta):
@abstractmethod
def serve(self, VegPizza):
pass
class DeluxeVeggiePizza(VegPizza):
def prepare(self):
print("Prepare ", type(self).__name__)
class ChickenPizza(NonVegPizza):
def serve(self, VegPizza):
print(type(self).__name__, "is served with Chicken on", type(VegPizza).__name__)
class MexicanVegPizza(VegPizza):
def prepare(self):
print("Prepare ", type(self).__name__)
class HamPizza(NonVegPizza):
def serve(self, VegPizza):
print(type(self).__name__, "is served with Ham on", type(VegPizza).__name__)
上面的代碼中,我們也進一步定義了AbstractProducts。我們創建了兩個抽象類:VegPizza和NonVegPizza;它們都定義了自己的方法,分別是prepare()和serve()。
然後我們爲每個AbstractProducts定義ConcreteProducts。就本例來說,我們創建了DeluxVeggiePizza和MexincanVegPizza,並實現prepare()方法。
我們還定義了ChickenPizza和HamPizza,並實現了serve()方法
當最終的用戶來到PizzaStore並且要一份美式非素食披薩的時候,USPizzaFactory負責準備素食,然後在上面加上火腿,馬上就變成非素食的披薩了;代碼如下:
class PizzaStore(object):
def __init__(self):
pass
def make_pizzas(self):
for factory in [IndianPizzaFactory(), USPizzaFactory()]:
self.factory = factory
self.NonVegPizza = self.factory.create_non_var_pizza()
self.VegPizza = self.factory.create_vag_pizza()
self.VegPizza.prepare()
self.NonVegPizza.serve(self.VegPizza)
pizza = PizzaStore()
pizza.make_pizzas()
工廠方法與抽象工廠方法對比
工廠方法 | 抽象工廠方法 |
它向客戶方開放了一個創建對象的方法 | 抽象工廠方法包含一個或多個工廠方法來創建一個系列的相關對象 |
它使用繼承和子類來決定要創建那個對象 | 它使用組合將創建對象的任務委託給其他類 |
工廠方法用於創建一個產品 | 抽象工廠方法用於創建相關產的系列 |