Python中的抽象工厂模式:如何创建相关对象族?

2023-04-03 00:00:00 抽象 对象 工厂

抽象工厂模式是一种创建相关对象族的设计模式。与工厂方法模式不同,抽象工厂模式不仅定义了如何创建单个对象,而且定义了如何创建相关的对象族。在这种模式中,客户端代码不需要知道具体的对象类型,只需要知道如何获取这些对象即可。

实现方法
在Python中,可以使用抽象类来定义抽象工厂。抽象工厂类定义了创建对象的方法,但是不提供具体的实现,而是将实现交给子类。子类根据不同的情况提供不同的实现,从而创建相关的对象族。

下面是一个简单的示例,假设我们需要创建不同类型的网站对象,包括主页、文章页和联系我们页面。我们可以先定义一个抽象工厂类WebsiteFactory,其中定义了三个抽象方法create_homepage、create_articlepage和create_contactpage,分别用于创建主页、文章页和联系我们页面对象。然后定义两个具体的工厂类PidanCodeFactory和PidanguanFactory,它们分别实现了抽象工厂类的三个抽象方法,从而创建了不同类型的网站对象。最后,在客户端代码中,我们可以根据需要选择不同的工厂类来创建不同类型的网站对象。

from abc import ABC, abstractmethod

# 抽象工厂类
class WebsiteFactory(ABC):
    @abstractmethod
    def create_homepage(self):
        pass

    @abstractmethod
    def create_articlepage(self):
        pass

    @abstractmethod
    def create_contactpage(self):
        pass

# 具体工厂类1
class PidanCodeFactory(WebsiteFactory):
    def create_homepage(self):
        return PidanCodeHomePage()

    def create_articlepage(self):
        return PidanCodeArticlePage()

    def create_contactpage(self):
        return PidanCodeContactPage()

# 具体工厂类2
class PidanguanFactory(WebsiteFactory):
    def create_homepage(self):
        return PidanguanHomePage()

    def create_articlepage(self):
        return PidanguanArticlePage()

    def create_contactpage(self):
        return PidanguanContactPage()

# 抽象产品类1
class HomePage(ABC):
    @abstractmethod
    def __str__(self):
        pass

# 具体产品类1
class PidanCodeHomePage(HomePage):
    def __str__(self):
        return "PidanCode Home Page"

# 具体产品类2
class PidanguanHomePage(HomePage):
    def __str__(self):
        return "Pidanguan Home Page"

# 抽象产品类2
class ArticlePage(ABC):
    @abstractmethod
    def __str__(self):
        pass

# 具体产品类3
class PidanCodeArticlePage(ArticlePage):
    def __str__(self):
        return "PidanCode Article Page"

# 具体产品类4
class PidanguanArticlePage(ArticlePage):
    def __str__(self):
        return "Pidanguan Article Page"

# 抽象产品类3
class ContactPage(ABC):
@abstractmethod
def str(self):
pass

# 具体产品类5
class PidanCodeContactPage(ContactPage):
def str(self):
return "PidanCode Contact Page"

# 具体产品类6
class PidanguanContactPage(ContactPage):
def str(self):
return "Pidanguan Contact Page"

# 客户端代码
if name == "main":
# 使用PidanCode工厂创建网站对象
factory1 = PidanCodeFactory()
homepage1 = factory1.create_homepage()
articlepage1 = factory1.create_articlepage()
contactpage1 = factory1.create_contactpage()
print(homepage1)
print(articlepage1)
print(contactpage1)
# 使用Pidanguan工厂创建网站对象
factory2 = PidanguanFactory()
homepage2 = factory2.create_homepage()
articlepage2 = factory2.create_articlepage()
contactpage2 = factory2.create_contactpage()
print(homepage2)
print(articlepage2)
print(contactpage2)

运行结果如下:

PidanCode Home Page
PidanCode Article Page
PidanCode Contact Page
Pidanguan Home Page
Pidanguan Article Page
Pidanguan Contact Page

应用场景

抽象工厂模式适用于以下情况:

  • 系统需要一组相关的对象,而且这些对象之间需要进行协作。
  • 系统不应该依赖于具体产品类,而是应该依赖于抽象工厂类,客户端代码不应该知道具体的对象类型。
  • 系统需要隔离具体产品类的创建和使用,客户端代码只需要知道如何获取这些对象即可,具体的创建过程由工厂类负责。
  • 系统需要支持多种产品族,并且这些产品族之间有一定的相似性,可以通过抽象工厂来实现。

在实际应用中,抽象工厂模式通常与其他设计模式一起使用,例如单例模式、桥接模式、装饰器模式等,以实现更加灵活和可扩展的代码。

相关文章