1. 什么是抽象工厂模式
抽象工厂模式是一种创建型设计模式,该模式提供一个接口,用于创建家族相关或依赖对象的工厂,而无需明确指定它们的类。即抽象工厂是针对一类产品族,而不是针对某一类产品。
2. 抽象工厂模式的结构
抽象工厂模式包含以下几个角色:
2.1. 抽象工厂(AbstractFactory)
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
2.2. 具体工厂(ConcreteFactory)
实现抽象工厂接口,具体工厂负责创建一组具有相同主题的产品。
2.3. 抽象产品(AbstractProduct)
为一类产品对象声明接口,通常是由抽象类或接口来实现。
2.4. 具体产品(ConcreteProduct)
定义一个将被具体工厂创建的产品对象。它实现了抽象产品接口。
下面是抽象工厂模式的结构图:
from abc import ABC, abstractmethod
class AbstractFactory(ABC):
@abstractmethod
def create_product_a(self):
pass
@abstractmethod
def create_product_b(self):
pass
class ConcreteFactory1(AbstractFactory):
def create_product_a(self):
return ConcreteProductA1()
def create_product_b(self):
return ConcreteProductB1()
class ConcreteFactory2(AbstractFactory):
def create_product_a(self):
return ConcreteProductA2()
def create_product_b(self):
return ConcreteProductB2()
class AbstractProductA(ABC):
@abstractmethod
def product_a_method(self):
pass
class ConcreteProductA1(AbstractProductA):
def product_a_method(self):
return "Product A1 method called"
class ConcreteProductA2(AbstractProductA):
def product_a_method(self):
return "Product A2 method called"
class AbstractProductB(ABC):
@abstractmethod
def product_b_method(self):
pass
class ConcreteProductB1(AbstractProductB):
def product_b_method(self):
return "Product B1 method called"
class ConcreteProductB2(AbstractProductB):
def product_b_method(self):
return "Product B2 method called"
3. 抽象工厂模式的应用场景
抽象工厂模式主要解决接口选择的问题,当一个类不知道它所必须创建的对象的类时,它可以使用工厂方法来代替直接创建对象。工厂方法让子类决定该创建什么对象。通常在以下情况下使用抽象工厂模式:
3.1. 系统的产品有多个系列
例如电子产品中的笔记本电脑和手机这两类产品,都有不同的系列,可以采用抽象工厂模式来生产这些系列产品。
3.2. 不希望客户端与工厂和产品的实现类耦合
当添加新产品时,客户端代码不需要进行修改,只需要添加产品工厂的实现类。
4. 抽象工厂模式的优缺点
4.1. 优点:
抽象工厂将客户端与类的实现分离开来,客户端通过它们的抽象接口操纵实际的具体实现类,使客户端代码从具体实现类中解耦。
给客户端提供了一些列的产品,让客户端能够选择他们需要的产品,而无需关心产品是如何实现的。
当增加一个新产品族时,无需修改代码,只需要增加一个具体工厂即可。
4.2. 缺点:
增加产品族变得困难。
当新增一个产品时,需要修改所有的具体工厂。
5. 抽象工厂模式 VS 工厂方法模式
很多人会把抽象工厂模式和工厂方法模式混淆,它们确实非常相似。它们都是为了解决对象创建问题的,但是它们之间还是有以下的区别:
工厂方法模式针对单一产品(即具体的抽象产品类),而抽象工厂模式针对的是一类产品(即抽象的产品类)。
工厂方法模式只需要一个工厂类,而抽象工厂模式需要多个工厂类。
工厂方法模式通过子类化实现工厂,而抽象工厂模式则是使用一个工厂类来创建相关产品的系列。
6. 结语
抽象工厂模式是一种非常优秀的创建型设计模式,用于创建一系列相关或相互依赖的对象。客户端使用抽象接口而不是具体类来操纵实际的具体实现类,从而减少了客户端与实现类之间的耦合。但是,在实际使用中需要考虑新增产品族变得困难的问题,还需要指出的是抽象工厂模式不适合日常开发中的所有场景,需要在具体的场景下进行权衡。