设计模式学习总结:抽象工厂(Abstract Factory)
来源:互联网 发布:什么牌子的美工刀片好 编辑:程序博客网 时间:2024/06/18 15:02
意图
提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类。
适用性
- 一个系统要独立于它的产品的创建、组合和表示时。
- 一个系统要由多个产品系列中的一个来配置时。
- 当你要强调一系列相关的产品对象的设计以便进行联合使用时。
- 当你提供一个产品类库,而只是想显示它们的接口而不是实现时。
结构
优缺点
优点
1>它分离了具体的类。因为一个工厂封装了创建产品对象的责任和过程,它将客户和类的实现分离。客户通过它们的抽象接口操纵实例。产品的类名也在具体工厂的实现中被分离,它们不出现在客户代码中。
2>当有多个产品系列时,它易于交换产品系列。因为一个抽象工厂创建了一个完整的产品系列,我们只需改变具体的工厂即可使用不同的产品系列。
3>它有利于产品的一致性。当一个系列中的产品对象被设计成一起工作时,一个应用一次只能使用一系列的产品,这一点很重要。
缺点
难以支持新种类的产品。抽象工厂的接口确定了可以被创建的产品集合,要支持新种类的产品就必须为所有工厂都新增一个接口。
实现
1>将工厂作为单件。一个应用中一般每个产品系列只需要一个抽象工厂,因此工厂最好实现为一个singleton。
2>创建产品。Abstract Factory仅声明一个创建产品的接口,真正创建产品是由ConcreteProduct子类来实现的。最通常的方法是为每一个产品定义一个工厂方法(Factory Method),一个具体的工厂将为每个产品重定义该工厂方法以指定产品。
3>定义可扩展的工厂。我们知道增加一种新的产品时,我们需要改变Abstract Factory的接口以及所有与它相关的类。一个更灵活但不安全的设计是给创建对象的操作增加一个参数,该参数指定了将被创建的对象的种类。但是仅有在所有对象都有相同的抽象基类,或者当产品对象可以被请求它们的客户安全的转换为正确类型时,你才能使用它。但是这种做法仍然具有一个问题,即客户不能区分或对一个产品的类别进行安全的假定,虽然客户可以进行向下的类型转换(比如用dynamic_cast),但是这并不总是安全的。
示例
相关模式
Factory Method(工厂方法):Abstract Factory通常用工厂方法来实现。
singleton:一个具体的工厂通常是一个单件。
- 设计模式学习总结:抽象工厂(Abstract Factory)
- 设计模式学习-抽象工厂(Abstract Factory)
- java设计模式学习 ----- 抽象工厂模式(Abstract Factory)
- 设计模式学习---Abstract Factory(抽象工厂)
- 设计模式学习笔记:Abstract Factory(抽象工厂)
- 设计模式学习笔记五:抽象工厂(Abstract Factory)
- 抽象工厂(Abstract Factory)设计模式
- 设计模式-抽象工厂(Abstract Factory)
- 抽象工厂(Abstract Factory)设计模式
- 设计模式-抽象工厂(Abstract Factory)
- 设计模式 一 抽象工厂Abstract Factory(工厂模式)
- 学习设计模式之二:抽象工厂模式(Abstract Factory)
- Abstract Factory Design Pattern 抽象工厂设计模式 - 总结
- 设计模式-抽象工厂模式(Abstract Factory)
- 设计模式:抽象工厂模式(Abstract Factory)
- C# 设计模式学习三 Abstract Factory 抽象工厂(概念)
- C# 设计模式学习三 Abstract Factory 抽象工厂(实例)
- 《设计模式》学习笔记——ABSTRACT FACTORY 抽象工厂
- 通过xml文件给图像加目标框的python模块
- protobuf简单使用
- 数据结构第四周项目1--建立单链表
- 纯代码(基于注解和代码,零xml)整合SSHM(Spring、SpringMVC、Hibernate、Mybatis)
- opencv(C++)扫描图像,查找表和时间测量
- 设计模式学习总结:抽象工厂(Abstract Factory)
- 动画演示10个有趣但毫无用处的Linux命令
- python案例
- 打造前端 Deepin Linux 工作环境——安装 koala css 预编译工具(安装deb包的方法
- ADV-148排队打水问题
- python3.x DNS轮训实例
- Windows下Opencv3.3+contrib+python2.7编译
- Java中如何自定义HTTPServlet中的请求方式?
- Lua 模块和包