在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++工厂方法模式讲解和代码示例的更多相关文章

  1. C#设计模式之二工厂方法模式(Factory Method Pattern)【创建型】

    一.引言 在上一篇文章中我们讲解了过渡的一种模式叫做[简单工厂],也有叫[静态工厂]的,通过对简单工厂模式得了解,我们也发现了它的缺点,就是随着需求的变化我们要不停地修改工厂里面的方法的代码,需求变化 ...

  2. 工厂方法模式(java 设计模式)

    1.工厂方法模式的定义 工厂方法模式使用的频率非常高, 在我们日常的开发中总能见到它的身影. 其定义为:Define an interface for creating an object,but l ...

  3. PHP面向对象-设计模式 单例模式 简单工厂模式 工厂方法模式

    1.单例模式 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例.即一个类只有一个对象实例. 要实现每一个类只有一个实例,就需 ...

  4. C#设计模式学习笔记:(2)工厂方法模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7567880.html,记录一下学习过程以备后续查用. 一.引言 接上一篇C#设计模式学习笔记:简单工厂模式( ...

  5. Java 工厂方法模式的简单示例

    工厂方法模式:也叫工厂模式,属于类创建型模式,工厂父类(接口)负责定义产品对象的公共接口,而子类工厂则负责创建具体的产品对象. 目的:是为了把产品的实例化操作延迟到子类工厂中完成,通过工厂子类来决定究 ...

  6. [改善Java代码]用枚举实现工厂方法模式更简洁

    工厂方法模式(Factory Method Patter)是"创建对象的接口",让子类决定实例化哪一个类,并使一个类的实例化延迟到其子类.工厂方法模式在我们的开发工作中,经常会用到 ...

  7. 设计模式之工厂方法模式(代码用Objective-C展示)

    前面一篇展示了一个简单工厂模式,这一篇主要是对比,工厂方法模式比简单工厂模式好在哪里?为什么要用这个模式?这个模式的精髓在哪里? 就以计算器为例,结果图如下: 加减乘除运算都是继承自基类运算类,然后工 ...

  8. 工厂方法模式--java代码实现

    工厂方法模式 工厂方法模式,对简单工厂模式进行了升级.我们将水果园比作一个工厂,在简单工厂模式下,水果园是一个具体的工厂,直接用来生产各种各样的水果.那么在工厂方法模式下,水果园是一个抽象工厂,那么苹 ...

  9. 设计模式(三)工厂方法模式(Factory Pattern)

    一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以 ...

随机推荐

  1. 文件上传漏洞靶场分析 UPLOAD_LABS

    文件上传漏洞靶场(作者前言) 文件上传漏洞 产生原理 PASS 1) function checkFile() { var file = document.getElementsByName('upl ...

  2. 从零打造一个Web地图引擎

    说到地图,大家一定很熟悉,平时应该都使用过百度地图.高德地图.腾讯地图等,如果涉及到地图相关的开发需求,也有很多选择,比如前面的几个地图都会提供一套js API,此外也有一些开源地图框架可以使用,比如 ...

  3. shell 同时执行多任务下载视频

    本文为博主原创,转载请注明出处: shell 脚本不支持多线程,但我们需要用shell 脚本同时跑多个任务时怎么让这些任务并发同时进行,可以采用在每个任务 后面 添加一个  & ,让其在后台运 ...

  4. NC20806 区区区间间间

    NC20806 区区区间间间 题目 题目描述 给出长度为n的序列a,其中第i个元素为 \(a_i\),定义区间(l,r)的价值为 \(v_{l,r} = max(a_i - a_j | l \leqs ...

  5. RapidEye快鸟、SPOT卫星遥感影像数据

    ​目前地理遥感生态网平台已发布高分辨率卫星遥感影像数据. 数据样例:百度云下载链接:https://pan.baidu.com/s/17ofPwpDM3OCHnE-LuhvUp 提取码:i0m4   ...

  6. Android刷第三方Recovery &获取root权限

    一.基础环境 Make sure your computer has working adb and fastboot. Setup instructions can be found here. E ...

  7. 04 MySQL_数据相关的SQL

    字符编码问题: 如果使用Windows电脑SQL语句中写中文报错的话,通过以下指令解决 set names gbk; 判空NULL问题: 判值用=,判空用is xxx = 非空值; xxx is nu ...

  8. Nginx配置解决NetCore的跨域

    使用Nginx配置解决NetCore的跨域 废话不多说,直接上Nginx配置 server { listen 80; server_name 你的Id或域名; location / { add_hea ...

  9. Druid 查询超时配置的探究 → DataSource 和 JdbcTemplate 的 queryTimeout 到底谁生效?

    开心一刻 昨晚跟我妈语音 妈:我年纪有点大了,想抱孩子了 我:妈,我都多大了,你还想抱我? 妈:我想抱小孩,谁乐意抱你呀! 我:刚好小区有人想找月嫂,要不我帮你联系下? 妈:你给我滚 然后她直接把语音 ...

  10. js Fetch返回数据res.json()报错问题

    前言 一直以来在简单的场景中经常使用fetch代替第三方请求库, fetch是JavaScript的原生函数, 简单.高效.快速.稳定.可定制等等诸多优点.一直也是用着很是舒服,直到有一天它竟然报错了 ...