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)
一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以 ...
随机推荐
- 基于web3D展示技术的煤矿巷道3D可视化系统
地下开采离不开巷道工程.煤矿的生产.运输.排水.通风等各个环节都少不了巷道的支持.在煤矿智能化建设被提上日程的今天,巷道工程的智能化.可视化建设也成了行业趋势.尤其是复杂的井下作业环境,人员信息安全问 ...
- python-将print内容保存到文件
通过sys.stdout得到print输出的内容,再进行保存 import sys class Logger(object): def __init__(self, file_path: str = ...
- UiPath选择器之页面选择器的介绍和使用
一.页面选择器的介绍 某些软件程序的布局和属性节点具有易变的值,例如某些Web应用程序.UiPath Studio无法预测这些变化,因此,您可能必须手动生成一些选择器. 每个属性都有一个分配的值.选择 ...
- Python之枚举法解数学题
作为初二的学生,数学题总是令我苦恼的问题.尤其是我们这里的预备班考试(即我们这里最好的两所高中提前一年招生,选拔尖子生的考试)将近,我所面对的数学题越发令人头疼. 这不,麻烦来了: 如图,在正方形AB ...
- 利用websocket实现手机扫码登陆后,同步登陆信息到web端页面
新手必看 广播系统 事件系统 准备工作 初始化项目 引入 laravel-websockets 软件包 启动 websocket 监听 主要流程 创建两个页面 建立 socket 连接 手机端扫码登陆 ...
- namespace_std 杂题选讲
CF1458C Latin Square 2021 EC Final C. Random Shuffle [THUPC2021] 混乱邪恶 [JOISC2022] 制作团子 3 2022 集训队互测 ...
- 聊聊 Netty 那些事儿之 Reactor 在 Netty 中的实现(创建篇)
本系列Netty源码解析文章基于 4.1.56.Final版本 在上篇文章<聊聊Netty那些事儿之从内核角度看IO模型>中我们花了大量的篇幅来从内核角度详细讲述了五种IO模型的演进过程以 ...
- HTML知识点概括——一篇文章带你完全掌握HTML
HTML知识点概括 前端三件套分别是HTML3,CSS5,JavaScript 稍微介绍一下W3C标准: 结构化标准语言(HTML) 表现标准语言(CSS) 行为标准(DOM,JavaScript) ...
- SVM简要介绍
SVM 支持向量机(SVM),是一个用于解决二分类问题的有监督机器学习模型. 1.SVM的两个优点 更高的速度 在有一定的样本数量支持下(成千上万张),具有比其他模型有更好的效果 2.SVM的工作过程 ...
- ooday08 Java_多态_向下强制转型
笔记: 多态: 表现: 同一个对象被造型为不同的类型时,有不同的功能 --对象的多态:我.你.水......------所有对象都是多态的(明天体会) 同一类型的引用指向不同的对象时,有不同的实现 - ...