元素码农
基础
UML建模
数据结构
算法
设计模式
网络
TCP/IP协议
HTTPS安全机制
WebSocket实时通信
数据库
sqlite
postgresql
clickhouse
后端
rust
go
java
php
mysql
redis
mongodb
etcd
nats
zincsearch
前端
浏览器
javascript
typescript
vue3
react
游戏
unity
unreal
C++
C#
Lua
App
android
ios
flutter
react-native
安全
Web安全
测试
软件测试
自动化测试 - Playwright
人工智能
Python
langChain
langGraph
运维
linux
docker
工具
git
svn
🌞
🌙
目录
▶
设计原则
单一职责原则
开闭原则
里氏替换原则
依赖倒置原则
接口隔离原则
迪米特法则
▶
创建型模式
工厂方法模式
抽象工厂
单例模式
建造者模式
原型模式
▶
结构型模式
适配器模式
装饰器模式
代理模式
外观模式
组合模式
桥接模式
享元模式
▶
行为型模式
策略模式
观察者模式
命令模式
模板方法模式
状态模式
责任链模式
迭代器模式
中介者模式
访问者模式
备忘录模式
解释器模式
发布时间:
2025-03-21 10:57
↑
☰
# 工厂方法模式 工厂方法模式是一种创建型设计模式,它定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。 ## 适用场景 1. 当你不知道该使用哪个具体类时 2. 当你希望用户能扩展你的软件库或框架的内部组件时 3. 当你希望复用现有对象来节省系统资源,而不是每次都重新创建对象时 ## UML类图 ```mermaid classDiagram class Creator { <<interface>> +factoryMethod()*Product } class ConcreteCreatorA { +factoryMethod()*Product } class ConcreteCreatorB { +factoryMethod()*Product } class Product { <<interface>> +operation() } class ConcreteProductA { +operation() } class ConcreteProductB { +operation() } Creator <|-- ConcreteCreatorA Creator <|-- ConcreteCreatorB Product <|-- ConcreteProductA Product <|-- ConcreteProductB ConcreteCreatorA ..> ConcreteProductA ConcreteCreatorB ..> ConcreteProductB ``` ## 代码示例 以下是一个使用Go语言实现的日志记录器工厂方法模式示例: ```go package main import "fmt" // Logger 接口定义了日志记录器的行为 type Logger interface { Log(message string) } // FileLogger 实现了文件日志记录 type FileLogger struct{} func (f *FileLogger) Log(message string) { fmt.Printf("File Logger: %s\n", message) } // ConsoleLogger 实现了控制台日志记录 type ConsoleLogger struct{} func (c *ConsoleLogger) Log(message string) { fmt.Printf("Console Logger: %s\n", message) } // LoggerFactory 接口定义了创建日志记录器的工厂方法 type LoggerFactory interface { CreateLogger() Logger } // FileLoggerFactory 实现了创建文件日志记录器的工厂 type FileLoggerFactory struct{} func (f *FileLoggerFactory) CreateLogger() Logger { return &FileLogger{} } // ConsoleLoggerFactory 实现了创建控制台日志记录器的工厂 type ConsoleLoggerFactory struct{} func (c *ConsoleLoggerFactory) CreateLogger() Logger { return &ConsoleLogger{} } func main() { // 使用文件日志记录器 fileFactory := &FileLoggerFactory{} fileLogger := fileFactory.CreateLogger() fileLogger.Log("这是一条文件日志") // 使用控制台日志记录器 consoleFactory := &ConsoleLoggerFactory{} consoleLogger := consoleFactory.CreateLogger() consoleLogger.Log("这是一条控制台日志") } ``` ## 优点 1. 符合开闭原则,可以在不修改现有代码的情况下引入新的产品类型 2. 避免了创建者和具体产品之间的紧密耦合 3. 将产品的创建逻辑集中到一个地方,使得代码更容易维护 4. 让创建对象的代码和使用对象的代码分离,降低了代码的耦合度 ## 缺点 1. 需要引入许多新的子类,可能会导致代码结构变得复杂 2. 对于简单的对象创建,可能会显得小题大做 ## 与其他模式的关系 1. 工厂方法模式通常在大型项目中与抽象工厂模式一起使用 2. 工厂方法可以作为模板方法模式的一个步骤 3. 工厂方法与原型模式可以互相补充,工厂方法可以通过克隆原型来创建对象 ## 实际应用场景 1. 数据库连接器的创建:不同类型数据库(MySQL、PostgreSQL等)的连接器 2. UI组件库:创建不同风格的按钮、输入框等组件 3. 日志系统:如示例中的不同类型日志记录器 4. 文档转换器:将文档转换为不同格式(PDF、HTML等)