Python工廠模式二

抽象工廠模式

抽象工廠模式的主要目的是提供一個接口來創建一系列相關對象,而無需指定具體的類。工廠方法將創建實例的任務委託給了子類,而抽象工廠方法的目標是創建一系列相關對象。

實現抽象工廠模式

想象一下,我們開辦了一家披薩店,供應美味的印式和美式披薩。爲此,我們首先創建一個抽象基類——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()

工廠方法與抽象工廠方法對比

工廠方法 抽象工廠方法
它向客戶方開放了一個創建對象的方法 抽象工廠方法包含一個或多個工廠方法來創建一個系列的相關對象
它使用繼承和子類來決定要創建那個對象 它使用組合將創建對象的任務委託給其他類
工廠方法用於創建一個產品 抽象工廠方法用於創建相關產的系列
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章