前言
工厂方法模式(英语:Factory method pattern) 又称为 虚拟构造函数、Virtual Constructor、Factory Method,是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型,工厂方法让类的实例化推迟到子类中进行。
简单工厂模式
简单工厂模式我们将其分为以下几类:
- 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。
- 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。
- 具体产品角色:工厂类所创建的对象就是此角色的实例。
简单设计模式存在的目的很简单:定义一个用于创建对象的接口。
缺点:对修改不封闭,新增加产品您要修改工厂。违法了鼎鼎大名的开闭法则(OCP)。
工厂方法模式
其实这才是真正的工厂模式,简单工厂模式只能算是“坑爹版”的工厂模式。我们能很容易看出工厂方法模式和简单工厂模式的区别之处:每一个产品是由自己的独立工厂产生。

工厂方法模式的应用并不是只是为了封装对象的创建,而是要把对象的创建放到子类中实现:Factory中只是提供了对象创建的接口,其实现将放在Factory的子类ConcreteFactory中进行。
对于工厂方法模式的组成:
- 抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。
- 具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
- 抽象产品角色:它是具体产品继承的父类或者是实现的接口。
- 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。
| 优点 | 缺点 |
|---|---|
1.你可以避免创建者和具体产品之间的紧密耦合。 | 每增加一种产品,就需要增加一个对象的工厂。 |
抽象工厂模式
抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。
抽象工厂模式:给客户端提供一个接口,可以创建多个产品族中的产品对象 .
而且使用抽象工厂模式还要满足一下条件:
- 系统中有多个产品族,而系统一次只可能消费其中一族产品。
- 同属于同一个产品族的产品一起使用。

抽象工厂模式的组成(和工厂方法模式一样):
- 抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。
- 具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
- 抽象产品角色:它是具体产品继承的父类或者是实现的接口。
- 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。
抽象工厂模式适合应用场景
-
如果代码需要与多个不同系列的相关产品交互, 但是由于无法提前获取相关信息, 或者出于对未来扩展性的考虑, 你不希望代码基于产品的具体类进行构建, 在这种情况下, 你可以使用抽象工厂。
-
抽象工厂为你提供了一个接口, 可用于创建每个系列产品的对象。 只要代码通过该接口创建对象, 那么你就不会生成与应用程序已生成的产品类型不一致的产品。
-
如果你有一个基于一组抽象方法的类, 且其主要功能因此变得不明确, 那么在这种情况下可以考虑使用抽象工厂模式。
-
在设计良好的程序中, 每个类仅负责一件事。 如果一个类与多种类型产品交互, 就可以考虑将工厂方法抽取到独立的工厂类或具备完整功能的抽象工厂类中。
与其他模式的关系
-
在许多设计工作的初期都会使用工厂方法模式 (较为简单, 而且可以更方便地通过子类进行定制), 随后演化为使用抽象工厂模式、 原型模式或生成器模式 (更灵活但更加复杂)。
-
生成器模式重点关注如何分步生成复杂对象。 抽象工厂专门用于生产一系列相关对象。 抽象工厂会马上返回产品, 生成器则允许你在获取产品前执行一些额外构造步骤。
-
抽象工厂模式通常基于一组工厂方法, 但你也可以使用原型模式来生成这些类的方法。
-
当只需对客户端代码隐藏子系统创建对象的方式时, 你可以使用抽象工厂来代替外观模式。
-
你可以将抽象工厂和桥接模式搭配使用。 如果由桥接定义的抽象只能与特定实现合作, 这一模式搭配就非常有用。 在这种情况下, 抽象工厂可以对这些关系进行封装, 并且对客户端代码隐藏其复杂性。
-
抽象工厂、 生成器和原型模式都可以用单例模式来实现。
参考
- C++设计模式 http://www.weixueyuan.net/cpp/shejimoshi/
- 设计模式C++实现(1)——工厂模式 - http://blog.youkuaiyun.com/wuzhekai1985/article/details/6660462
- 三种工厂模式的C++实现 https://blog.youkuaiyun.com/silangquan/article/details/20492293
- 创建型模式 https://refactoringguru.cn/design-patterns/factory-comparison

本文探讨了工厂模式的进阶概念,包括简单工厂模式、工厂方法模式及抽象工厂模式的区别与优缺点。通过实例演示,揭示了如何利用这些模式解耦创建过程,以及它们在不同场景下的适用性。

841

被折叠的 条评论
为什么被折叠?



