抽象工厂模式(Abstract Factory Pattern)也是一种创建型设计模式,它提供了一种方式,可以创建一系列相互关联或相互依赖的对象,而不需要指定它们的具体类。
抽象工厂模式通常包含四个角色:抽象工厂、具体工厂、抽象产品和具体产品。抽象工厂定义了一系列产品的创建接口,具体工厂实现了抽象工厂的接口,用于创建一系列相关的具体产品。抽象产品定义了产品的接口,具体产品实现了抽象产品的接口,用于创建具体的产品。
以下是一个使用抽象工厂模式的示例代码:
python
Copy
class Button:
def paint(self):
pass
class LinuxButton(Button):
def paint(self):
return "Painting a button in a Linux style"
class WindowsButton(Button):
def paint(self):
return "Painting a button in a Windows style"
class Checkbox:
def paint(self):
pass
class LinuxCheckbox(Checkbox):
def paint(self):
return "Painting a checkbox in a Linux style"
class WindowsCheckbox(Checkbox):
def paint(self):
return "Painting a checkbox in a Windows style"
class GUIFactory:
def create_button(self):
pass
def create_checkbox(self):
pass
class LinuxFactory(GUIFactory):
def create_button(self):
return LinuxButton()
def create_checkbox(self):
return LinuxCheckbox()
class WindowsFactory(GUIFactory):
def create_button(self):
return WindowsButton()
def create_checkbox(self):
return WindowsCheckbox()
class Application:
def init(self, factory):
self.factory = factory
def create_UI(self):
button = self.factory.create_button()
checkbox = self.factory.create_checkbox()
return f"{button.paint()} and {checkbox.paint()}"
app1 = Application(LinuxFactory())
app2 = Application(WindowsFactory())
print(app1.create_UI()) # 输出 "Painting a button in a Linux style and Painting a checkbox in a Linux style"
print(app2.create_UI()) # 输出 "Painting a button in a Windows style and Painting a checkbox in a Windows style"
在这个示例中,Button 和 Checkbox 是抽象产品,LinuxButton、WindowsButton、LinuxCheckbox 和 WindowsCheckbox 是具体产品,它们实现了抽象产品的接口。GUIFactory 是抽象工厂,定义了创建一系列产品的抽象方法。LinuxFactory 和 WindowsFactory 是具体工厂,实现了抽象工厂的接口,用于创建一系列相关的具体产品。
当客户端调用 LinuxFactory 和 WindowsFactory 的方法时,它会创建对应的具体产品,并返回给客户端。
要使用抽象工厂模式,首先需要确定需要创建的产品族以及产品族中的产品接口。然后实现一个抽象工厂类,并在其中定义一系列创建产品的抽象方法。接着实现一个具体工厂类,并在其中实现抽象工厂类中的抽象方法,用于创建相关的具体产品。最后在客户端中使用具体工厂类来创建需要的产品族。
意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
主要解决:主要解决接口选择的问题。
何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
如何解决:在一个产品族里面,定义多个产品。
关键代码:在一个工厂里聚合多个同类产品。
应用实例:工作了,为了参加一些聚会,肯定有两套或多套衣服吧,比如说有商务装(成套,一系列具体产品)、时尚装(成套,一系列具体产品),甚至对于一个家庭来说,可能有商务女装、商务男装、时尚女装、时尚男装,这些也都是成套的,即一系列具体产品。假设一种情况(现实中是不存在的,但有利于说明抽象工厂模式),在您的家中,某一个衣柜(具体工厂)只能存放某一种这样的衣服(成套,一系列具体产品),每次拿这种成套的衣服时也自然要从这个衣柜中取出了。用 OOP 的思想去理解,所有的衣柜(具体工厂)都是衣柜类的(抽象工厂)某一个,而每一件成套的衣服又包括具体的上衣(某一具体产品),裤子(某一具体产品),这些具体的上衣其实也都是上衣(抽象产品),具体的裤子也都是裤子(另一个抽象产品)。
优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
使用场景: 1、QQ 换皮肤,一整套一起换。 2、生成不同操作系统的程序。
注意事项:产品族难扩展,产品等级易扩展。
抽象工厂模式包含以下几个核心角色:
抽象工厂(Abstract Factory):声明了一组用于创建产品对象的方法,每个方法对应一种产品类型。抽象工厂可以是接口或抽象类。
具体工厂(Concrete Factory):实现了抽象工厂接口,负责创建具体产品对象的实例。
抽象产品(Abstract Product):定义了一组产品对象的共同接口或抽象类,描述了产品对象的公共方法。
具体产品(Concrete Product):实现了抽象产品接口,定义了具体产品的特定行为和属性。
抽象工厂模式通常涉及一族相关的产品,每个具体工厂类负责创建该族中的具体产品。客户端通过使用抽象工厂接口来创建产品对象,而不需要直接使用具体产品的实现类。
抽象工厂模式:
《Head First 设计模式》第 5 章:工厂模式。这本书是一本很好的学习设计模式的入门书籍,适合初学者阅读。
《设计模式:可复用面向对象软件的基础》。这是一本经典的设计模式书籍,其中详细介绍了抽象工厂模式以及其他 22 种设计模式。
《大话设计模式》第 6 章:抽象工厂模式。这本书通过生动的故事情节和通俗易懂的语言介绍了各种设计模式,适合初学者阅读。
设计模式视频教程。有很多优秀的设计模式视频教程,可以通过观看视频来更好地理解抽象工厂模式和其他设计模式。
GitHub 上的设计模式示例代码。可以通过查看其他开发者编写的示例代码来学习抽象工厂模式的具体实现方式。