设计模式:创建型模式之工厂模式(c++)

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

前言

工厂方法模式(英语:Factory method pattern) 又称为 虚拟构造函数、Virtual Constructor、Factory Method,是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型,工厂方法让类的实例化推迟到子类中进行

简单工厂模式

简单工厂模式我们将其分为以下几类:

  1. 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。
  2. 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。
  3. 具体产品角色:工厂类所创建的对象就是此角色的实例。

在这里插入图片描述
在线实验 demo

简单设计模式存在的目的很简单:定义一个用于创建对象的接口。
缺点:对修改不封闭,新增加产品您要修改工厂。违法了鼎鼎大名的开闭法则(OCP)。


工厂方法模式

其实这才是真正的工厂模式,简单工厂模式只能算是“坑爹版”的工厂模式。我们能很容易看出工厂方法模式和简单工厂模式的区别之处:每一个产品是由自己的独立工厂产生。
在这里插入图片描述
工厂方法模式的应用并不是只是为了封装对象的创建,而是要把对象的创建放到子类中实现:Factory中只是提供了对象创建的接口,其实现将放在Factory的子类ConcreteFactory中进行。

对于工厂方法模式的组成:

  1. 抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。
  2. 具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
  3. 抽象产品角色:它是具体产品继承的父类或者是实现的接口。
  4. 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。

在线实验 demo2

优点缺点

1.你可以避免创建者和具体产品之间的紧密耦合。
2.单一职责原则。 你可以将产品创建代码放在程序的单一位置, 从而使得代码更容易维护。
3.开闭原则。 无需更改现有客户端代码, 你就可以在程序中引入新的产品类型。

每增加一种产品,就需要增加一个对象的工厂。
应用工厂方法模式需要引入许多新的子类, 代码可能会因此变得更复杂。
最好的情况是将该模式引入创建者类的现有层次结构中。

抽象工厂模式

抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。

抽象工厂模式:给客户端提供一个接口,可以创建多个产品族中的产品对象 .

而且使用抽象工厂模式还要满足一下条件:

  1. 系统中有多个产品族,而系统一次只可能消费其中一族产品。
  2. 同属于同一个产品族的产品一起使用。
    在这里插入图片描述

抽象工厂模式的组成(和工厂方法模式一样):

  1. 抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。
  2. 具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
  3. 抽象产品角色:它是具体产品继承的父类或者是实现的接口。
  4. 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。

在线实验 demo3

抽象工厂模式适合应用场景

  • 如果代码需要与多个不同系列的相关产品交互, 但是由于无法提前获取相关信息, 或者出于对未来扩展性的考虑, 你不希望代码基于产品的具体类进行构建, 在这种情况下, 你可以使用抽象工厂。

  • 抽象工厂为你提供了一个接口, 可用于创建每个系列产品的对象。 只要代码通过该接口创建对象, 那么你就不会生成与应用程序已生成的产品类型不一致的产品。

  • 如果你有一个基于一组抽象方法的类, 且其主要功能因此变得不明确, 那么在这种情况下可以考虑使用抽象工厂模式。

  • 在设计良好的程序中, 每个类仅负责一件事。 如果一个类与多种类型产品交互, 就可以考虑将工厂方法抽取到独立的工厂类或具备完整功能的抽象工厂类中。

与其他模式的关系

  • 在许多设计工作的初期都会使用工厂方法模式 (较为简单, 而且可以更方便地通过子类进行定制), 随后演化为使用抽象工厂模式、 原型模式或生成器模式 (更灵活但更加复杂)。

  • 生成器模式重点关注如何分步生成复杂对象。 抽象工厂专门用于生产一系列相关对象。 抽象工厂会马上返回产品, 生成器则允许你在获取产品前执行一些额外构造步骤。

  • 抽象工厂模式通常基于一组工厂方法, 但你也可以使用原型模式来生成这些类的方法。

  • 当只需对客户端代码隐藏子系统创建对象的方式时, 你可以使用抽象工厂来代替外观模式。

  • 你可以将抽象工厂和桥接模式搭配使用。 如果由桥接定义的抽象只能与特定实现合作, 这一模式搭配就非常有用。 在这种情况下, 抽象工厂可以对这些关系进行封装, 并且对客户端代码隐藏其复杂性。

  • 抽象工厂、 生成器和原型模式都可以用单例模式来实现。

参考

  • 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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值