抽象工厂模式
约 626 字大约 2 分钟
2025-12-14
定义
为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类。
抽象工厂模式的优点
- 封装性。每个产品的实现类不是高层模块要关心的,它要关心的是接口,是抽象,它不关心对象是如何创建出来。它只需要关心工厂,只要知道工厂是谁,就能创建出一个需要的对象。
- 产品族内的约束为非公开状态。
抽象工厂模式的缺点
抽象工厂模式的最大缺点就是产品族扩展非常困难。增加一个产品A,抽象类AbstractCreator要增加一个方法createProductA() ,然后两个实现类都要修改,这严重违反了开闭原则。
抽象工厂模式的使用场景
抽象工厂模式的使用场景定义非常简单:一个对象族(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式。
抽象工厂模式的注意事项
在抽象工厂模式的缺点中,我们提到抽象工厂模式的产品族扩展比较困难,但是一定要清楚,是产品族扩展困难,而不是产品等级。 在该模式下,产品等级是非常容易扩展的,增加一个产品等级,只要增加一个工厂类负责新增加出来的产品生产任务即可。 也即是说,横向扩展容易,纵向扩展困难。
示例
抽象产品 and 产品
type Notifier interface {
Send(msg string)
}
type Logger interface {
Log(msg string)
}
// email
type EmailNotifier struct{}
func (n *EmailNotifier) Send(msg string) {
// ...
}
type EmailLogger struct{}
func (l *EmailLogger) Log(msg string) {
// ...
}
// sms
type SMSNotifier struct{}
func (n *SMSNotifier) Send(msg string) {
// ...
}
type SMSLogger struct{}
func (l *SMSLogger) Log(msg string) {
// ...
}抽象工厂
type MessageFactory interface {
CreateNotifier() Notifier
CreateLogger() Logger
}具体工厂
type EmailFactory struct{}
func (f *EmailFactory) CreateNotifier() Notifier {
return &EmailNotifier{}
}
func (f *EmailFactory) CreateLogger() Logger {
return &EmailLogger{}
}
type SMSFactory struct{}
func (f *SMSFactory) CreateNotifier() Notifier {
return &SMSNotifier{}
}
func (f *SMSFactory) CreateLogger() Logger {
return &SMSLogger{}
}客户端代码
func Process(factory MessageFactory) {
logger := factory.CreateLogger()
notifier := factory.CreateNotifier()
logger.Log("start")
notifier.Send("hello")
}