C++工厂方法模式讲解和代码示例
在C++中使用模式
使用示例: 工厂方法模式在 C++ 代码中得到了广泛使用。 当你需要在代码中提供高层次的灵活性时, 该模式会非常实用。
识别方法: 工厂方法可通过构建方法来识别, 它会创建具体类的对象, 但以抽象类型或接口的形式返回这些对象。
main.cpp概念示例
- /*
- Product接口声明了所有具体产品必须实现的操作。
- */
- class Product{
- public:
- virtual ~Product() {}
- virtual std::string Operation() const = 0 ;
- };
- /*
- 具体的产品提供了Product接口的各种实现
- */
- class ConcreteProduct1:public Product{
- public:
- std::string Operation() const override {
- return "{Result of the ConcreteProduct1}";
- }
- };
- clss ConcreteProduct2:public Product{
- public:
- std::string Operation() const override{
- return "{Result of the ConcretProduct2}";
- }
- };
- /*
- Creator类声明了工厂方法,该方法应该返回Product类的一个对象。创建者的子类通常提供此方法的实现。
- */
- class Creator{
- /*注意,创建者还可能提供工厂方法的一些默认实现*/
- public:
- virtual ~Creator() {};
- virtual Product * FactoryMethod() const = 0;
- /*
- 还要注意,尽管它的名字,创建者的主要职责不是创建产品。通常,它包含一些核心业务逻辑,
这些逻辑依赖于由工厂方法返回的Product对象。子类可以间接地改变这一业务逻辑通过覆盖工厂方法返回一个不同类型的产品。- */
- std::string SomeOperation() const {
- /*调用工厂方法来创建Product对象*/
- Product *product = this->FactoryMethod();
- /*现在就可以使用product了*/
- std::string result = "Creator: The same creator 's code has just worked with " + product->Operation();
- delete product;
- return result;
- }
- };
- /*
- 具体的创建者覆盖工厂方法以更改结果产品的类型。
- */
- class ConcreteCreator1 : public Creator{
- /*
- 注意,方法的签名仍然使用抽象产品类型,即使具体产品实际上是从方
- 法返回的。这样创建者就可以独立于具体的产品类。
- */
- public:
- Product * FactoryMethod() const override{
- return new ConcreteProduct1();
- }
- };
- class ConcreteCreator2 : public Creator{
- public:
- Product * FactoryMethod() const override{
- return new ConcreteProduct2();
- };
- /*
- 客户端代码与具体创建者的实例一起工作,尽管是通过其基本接口进行的。只要客户端保持与创建者通过基础界面,您可以通过它的创造者的子类。
- */
- void ClientCode(const Creator & creator){
- std::cout << "Client: I'm not aware of the creator's class, but it still works.\n" << creator.SomeOperation() <<std::endl;
- }
- /*应用程序根据配置或环境选择创建者的类型*/
- int main() {
- std::cout << "App: Launched with the ConcreteCreator1.\n";
- Creator* creator = new ConcreteCreator1();
- ClientCode(*creator);
- std::cout << std::endl;
- std::cout << "App: Launched with the ConcreteCreator2.\n";
- Creator* creator2 = new ConcreteCreator2();
- ClientCode(*creator2);
- delete creator;
- delete creator2;
- return 0;
- }
执行结果如下:
- App: Launched with the ConcreteCreator1.
- Client: I'm not aware of the creator's class, but it still works.
- Creator: The same creator's code has just worked with {Result of the ConcreteProduct1}
- App: Launched with the ConcreteCreator2.
- Client: I'm not aware of the creator's class, but it still works.
- Creator: The same creator's code has just worked with {Result of the ConcreteProduct2}
C++工厂方法模式讲解和代码示例的更多相关文章
- C#设计模式之二工厂方法模式(Factory Method Pattern)【创建型】
一.引言 在上一篇文章中我们讲解了过渡的一种模式叫做[简单工厂],也有叫[静态工厂]的,通过对简单工厂模式得了解,我们也发现了它的缺点,就是随着需求的变化我们要不停地修改工厂里面的方法的代码,需求变化 ...
- 工厂方法模式(java 设计模式)
1.工厂方法模式的定义 工厂方法模式使用的频率非常高, 在我们日常的开发中总能见到它的身影. 其定义为:Define an interface for creating an object,but l ...
- PHP面向对象-设计模式 单例模式 简单工厂模式 工厂方法模式
1.单例模式 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例.即一个类只有一个对象实例. 要实现每一个类只有一个实例,就需 ...
- C#设计模式学习笔记:(2)工厂方法模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7567880.html,记录一下学习过程以备后续查用. 一.引言 接上一篇C#设计模式学习笔记:简单工厂模式( ...
- Java 工厂方法模式的简单示例
工厂方法模式:也叫工厂模式,属于类创建型模式,工厂父类(接口)负责定义产品对象的公共接口,而子类工厂则负责创建具体的产品对象. 目的:是为了把产品的实例化操作延迟到子类工厂中完成,通过工厂子类来决定究 ...
- [改善Java代码]用枚举实现工厂方法模式更简洁
工厂方法模式(Factory Method Patter)是"创建对象的接口",让子类决定实例化哪一个类,并使一个类的实例化延迟到其子类.工厂方法模式在我们的开发工作中,经常会用到 ...
- 设计模式之工厂方法模式(代码用Objective-C展示)
前面一篇展示了一个简单工厂模式,这一篇主要是对比,工厂方法模式比简单工厂模式好在哪里?为什么要用这个模式?这个模式的精髓在哪里? 就以计算器为例,结果图如下: 加减乘除运算都是继承自基类运算类,然后工 ...
- 工厂方法模式--java代码实现
工厂方法模式 工厂方法模式,对简单工厂模式进行了升级.我们将水果园比作一个工厂,在简单工厂模式下,水果园是一个具体的工厂,直接用来生产各种各样的水果.那么在工厂方法模式下,水果园是一个抽象工厂,那么苹 ...
- 设计模式(三)工厂方法模式(Factory Pattern)
一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以 ...
随机推荐
- JavaScript有哪些数据类型,它们的区别?
基本数据类型:number.string.boolean.Undefined.NaN(特殊值).BigInt.Symbol 引入数据类型:Object NaN是JS中的特殊值,表示非数字,NaN不是数 ...
- gitlab备份迁移与升级
升级计划: https://docs.gitlab.com/ee/update/index.html#upgrade-paths 1. 安装gitlab(和源版本必须保持一致) wget https: ...
- 一条update语句到底加了多少锁?带你深入理解底层原理
迎面走来了你的面试官,身穿格子衫,挺着啤酒肚,发际线严重后移的中年男子. 手拿泡着枸杞的保温杯,胳膊夹着MacBook,MacBook上还贴着公司标语:"我爱加班". 面试开始,直 ...
- tauri+vue开发小巧的跨OS桌面应用-股票体检
最近打算写一个用于股票体检的软件,比如股权质押比过高的股票不合格,ROE小于10的股票不合格,PE大于80的股票不合格等等等等,就像给人做体检一样给股票做个体检.也实现了一些按照技术指标.基本面自动选 ...
- HashSet 添加/遍历元素源码分析
HashSet 类图 HashSet 简单说明 HashSet 实现了 Set 接口 HashSet 底层实际上是由 HashMap 实现的 public HashSet() { map = new ...
- ShardingSphere 云上实践:开箱即用的 ShardingSphere-Proxy 集群
本次 Apache ShardingSphere 5.1.2 版本更新为大家带来了三大全新功能,其中之一即为使用 ShardingSphere-Proxy chart 在云环境中快速部署一套 Shar ...
- Pytorch 中 tensor的维度拼接
torch.stack() 和 torch.cat() 都可以按照指定的维度进行拼接,但是两者也有区别,torch.satck() 是增加新的维度进行堆叠,即其维度拼接后会增加一个维度:而torch. ...
- 4-7 CS后台项目练习-1
1. 关于此项目 此项目是一个自营性质电商类型的项目. 当前目标是设计后台管理相关功能. 2. 关于项目的开发流程 开发项目的标准流程应该有:需求分析.可行性分析.总体设计.详细设计等. 建议课后学习 ...
- 04 MySQL_数据相关的SQL
字符编码问题: 如果使用Windows电脑SQL语句中写中文报错的话,通过以下指令解决 set names gbk; 判空NULL问题: 判值用=,判空用is xxx = 非空值; xxx is nu ...
- Linux中安装JDK详细步骤
一.下载Linux版本的JDK 进入官网下载对应的JDK,下载之前需要先登录 官网地址 -> https://www.oracle.com/ 登录成功后,找到对应的下载位置 根据自己电脑下载对应 ...