设计模式学习笔记五:抽象工厂(Abstract Factory)
1.概述
意图:
提供一个创建一系列相关或相互依赖的对象的接口,而无需指定其具体的类。
使用场合:
在以下场合可以使用抽象工厂:
(1).一个系统要独立于其产品的创建、组合和表示时;
(2).一个系统要有多个产品系列中的一个来配置时
(3).需要提供一个产品类库,而只想显示他们的接口,而影藏其实现时。
抽象工厂结构:
(1).AbstractFactory:声明一个创建抽象产品对象的接口。
(2).CreateFactory:实现创建具体产品对象的操作。
(3).AbstractProduct:为一类产品对象声明接口。
(4).CreateProduct:定义一个将被相应具体工厂创建的产品对象,以实现AbstractProduct接口。
(5).仅使用AbstractFactory和AbstractProduct类声明的接口。
2.实例
大话设计模式中的用了抽象工厂模式的数据访问,结构图:

抽象工厂:
(2).CreateFactory:实现创建具体产品对象的操作。
(3).AbstractProduct:为一类产品对象声明接口。
(4).CreateProduct:定义一个将被相应具体工厂创建的产品对象,以实现AbstractProduct接口。
(5).仅使用AbstractFactory和AbstractProduct类声明的接口。
2.实例
大话设计模式中的用了抽象工厂模式的数据访问,结构图:
抽象工厂:

具体工厂:


实体类:


User:



Department:



运行结果:
3.总结
实现要点: 抽象工厂本身不负责创建产品,产品最终还是由具体工厂来创建的。比如,Iua是AccessFactory创建的,而不是IFactory创建的。在.NET中可以使用反射来创建具体工厂,从而使得代码变动降到最低;在抽象工厂中需要体现出生产一系列产品。这一系列产品是相互关联,相互依赖一起使用的; 抽象工厂对应抽象产品,具体工厂对应具体产品,外部依赖抽象类型,这样对于新系列产品的创建,外部唯一依赖的就是具体工厂的创建过程(可以通过反射解决)。
注意事项:一般来说需要创建一系列对象的时候才考虑抽象工厂;如果系统的变化点不在新系列的扩充上,那么就没有必要使用抽象工厂。
优点: 分离了具体的类。抽象工厂模式帮助你控制一个应用创建的对象的类,因为一个工厂封装创建产品对象的责任和过程。它将客户和类的实现分离,客户通过他们的抽象接口操纵实例,产品的类名也在具体工厂的实现中被分离,它们不出现在客户代码中;它使得易于交换产品系列。一个具体工厂类在一个应用中仅出现一次——即在它初始化的时候。这使得改变一个应用的具体工厂变得很容易。它只需改变具体的工厂即可使用不同的产品配置,这是因为一个抽象工厂创建了一个完整的产品系列,所以整个产品系列会立刻改变; 它有利于产品的一致性。当一个系列的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象,这一点很重要,而抽象工厂很容易实现这一点。
缺点:难以支持新种类的产品。难以扩展抽象工厂以生产新种类的产品。这是因为抽象工厂几口确定了可以被创建的产品集合,支持新种类的产品就需要扩展该工厂接口,这将涉及抽象工厂类及其所有子类的改变。
关注 熵减黑客 ,一起学习成长

分类:
设计模式
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端