1. 简介
工厂方法模式是一种创建型设计模式,它提供了一种将对象的创建委托给子类的方式。这样,客户端主要通过使用基类的接口来操作对象,而不是直接实例化他们。工厂方法模式的核心思想是封装对象的创建过程,并将其延迟到子类来完成。
2. 工厂方法模式的结构
2.1. 抽象产品(Product)类
抽象产品类定义了产品对象的共同接口,它包含了产品类的公共方法声明。
class Product:
def operation(self):
pass
2.2. 具体产品(Concrete Product)类
具体产品类是抽象产品类的子类,实现了抽象产品类定义的接口。
class ConcreteProduct(Product):
def operation(self):
return "具体产品的操作"
2.3. 抽象工厂(Creator)类
抽象工厂类是工厂方法模式的核心,它声明了创建产品对象的工厂方法,返回一个抽象产品对象。
class Creator:
def factory_method(self):
pass
def some_operation(self):
product = self.factory_method()
return product.operation()
2.4. 具体工厂(Concrete Creator)类
具体工厂类是抽象工厂类的子类,实现了抽象工厂类定义的工厂方法,返回一个具体产品对象。
class ConcreteCreator(Creator):
def factory_method(self):
return ConcreteProduct()
3. 工厂方法模式的使用场景
工厂方法模式在以下情况下可以使用:
当一个类无法预知它必须创建的对象的具体类型时
当一个类希望由它的子类来决定要创建的对象的类型时
当一个类将创建对象的职责委托给多个帮助子类中的某一个,并希望将哪个子类使用的信息局部化时
工厂方法模式可以将对象的创建与使用代码分离,降低了代码的耦合度,使得代码更易于维护和扩展。
4. 示例
假设有一个应用程序需要创建和操作各种不同类型的文档,包括PDF文档、Word文档和Excel文档。通过工厂方法模式,可以将文档创建的过程封装到一个抽象工厂类中,具体类型的文档创建由子类实现。
首先,定义抽象产品类Document
:
class Document:
def create(self):
pass
然后,定义具体产品类PDFDocument
、WordDocument
和ExcelDocument
:
class PDFDocument(Document):
def create(self):
return "创建PDF文档"
class WordDocument(Document):
def create(self):
return "创建Word文档"
class ExcelDocument(Document):
def create(self):
return "创建Excel文档"
接下来,定义抽象工厂类DocumentFactory
:
class DocumentFactory:
def create_document(self):
pass
def some_operation(self):
document = self.create_document()
return document.create()
最后,定义具体工厂类PDFDocumentFactory
、WordDocumentFactory
和ExcelDocumentFactory
:
class PDFDocumentFactory(DocumentFactory):
def create_document(self):
return PDFDocument()
class WordDocumentFactory(DocumentFactory):
def create_document(self):
return WordDocument()
class ExcelDocumentFactory(DocumentFactory):
def create_document(self):
return ExcelDocument()
使用工厂方法模式创建和操作文档:
pdf_factory = PDFDocumentFactory()
pdf_document = pdf_factory.some_operation()
print(pdf_document) # 输出:创建PDF文档
word_factory = WordDocumentFactory()
word_document = word_factory.some_operation()
print(word_document) # 输出:创建Word文档
excel_factory = ExcelDocumentFactory()
excel_document = excel_factory.some_operation()
print(excel_document) # 输出:创建Excel文档
从上面的代码示例中可以看出,客户端主要通过抽象工厂类DocumentFactory
和抽象产品类Document
进行操作,而不需要关心具体的文档类型是如何创建的。
5. 总结
工厂方法模式是一种创建型设计模式,它通过将对象的创建委托给子类来封装对象的创建过程。工厂方法模式可以降低代码的耦合度,使得代码更易于维护和扩展。在合适的场景下,使用工厂方法模式可以提供更灵活和可扩展的设计。