首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++中的工厂方法模式实现:作用域,指针与引用

在C++中,工厂方法模式是一种创建型设计模式,它允许在运行时根据需要创建对象,而无需指定它们的确切类。工厂方法模式通过将对象创建过程封装在一个独立的工厂类中来实现这一点。

以下是一个简单的C++工厂方法模式实现示例:

代码语言:cpp
复制
#include<iostream>
#include<memory>

class Product {
public:
    virtual ~Product() = default;
};

class ConcreteProductA : public Product {
public:
    void print() {
        std::cout << "ConcreteProductA"<< std::endl;
    }
};

class ConcreteProductB : public Product {
public:
    void print() {
        std::cout << "ConcreteProductB"<< std::endl;
    }
};

class Creator {
public:
    virtual ~Creator() = default;
    virtual std::unique_ptr<Product> factoryMethod() = 0;
};

class ConcreteCreatorA : public Creator {
public:
    std::unique_ptr<Product> factoryMethod() override {
        return std::make_unique<ConcreteProductA>();
    }
};

class ConcreteCreatorB : public Creator {
public:
    std::unique_ptr<Product> factoryMethod() override {
        return std::make_unique<ConcreteProductB>();
    }
};

int main() {
    std::unique_ptr<Creator> creatorA = std::make_unique<ConcreteCreatorA>();
    std::unique_ptr<Product> productA = creatorA->factoryMethod();
    productA->print();

    std::unique_ptr<Creator> creatorB = std::make_unique<ConcreteCreatorB>();
    std::unique_ptr<Product> productB = creatorB->factoryMethod();
    productB->print();

    return 0;
}

在这个示例中,我们定义了一个基类Product和两个派生类ConcreteProductAConcreteProductB。这些类表示我们希望通过工厂方法创建的对象。

我们还定义了一个基类Creator和两个派生类ConcreteCreatorAConcreteCreatorB。这些类负责创建Product对象。Creator类定义了一个纯虚函数factoryMethod(),该函数返回一个std::unique_ptr<Product>

ConcreteCreatorAConcreteCreatorB分别重写factoryMethod()函数,以返回不同类型的Product对象。

main()函数中,我们创建了两个不同的Creator对象,并使用它们的factoryMethod()函数创建了两个不同类型的Product对象。

这个示例演示了如何在C++中实现工厂方法模式,并使用指针和引用来处理对象。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

实现装饰者模式思考C++指针引用选择

实现装饰者模式思考C++指针引用选择 最近在看设计模式内容,偶然间手痒就写了一个“装饰者”模式一个实例。该实例来源于风雪涟漪博客,我对它做了简化。...作为一个经典设计模式,本身并没有太多要说内容。但是在我尝试使用C++实现这个模式实例时候,出现了一些看似无关紧要但是却引人深思问题。 首先,我想简单介绍一下这个实例含义。...以上说明如果还不够清楚的话,下边展示具体实现代码。这里就需要考虑cake成员类型问题,一般使用指针类型可能更符合C++编程习惯。...当然,使用引用或许更合理,因为按照平常经验,很多使用C++指针地方都可以用引用代替,有人甚至建议多使用引用少使用指针(当然我也承认C++引用也有很多好处~)。...回视本文刚开始举例子和该文主题,或许我们应该清楚有时候的确要好好区分一下指针引用差别了,当然本文也是从一个实践例子中去发现和挖掘这一点。

1.1K100

C++作用生命周期

因此,C++谈及作用生命周期针对就是这三大程序组成要素:函数、数据类型和变量。下面将一一讲述。 ---- 1.作用生命周期区别 作用生命周期是完全两个不同概念。...- 引用方法:其他文件要使用必须用点操作符(.)或作用运算符(::)来引用。 - 内存分布:代码区。...复合数据类型: 复合数据类型包括:数组(type[])、指针(type*)、引用(type&)、枚举(enum)。 如果复合数据类型是构造数据类型参与复合,其作用构造数据类型一致。...- 引用方法:其他文件要先进行定义,再通过作用运算符进行使用。 - 内存分布:代码区。...全局变量: - 作用:全局作用(全局变量只需在一个源文件定义,就可以作用于所有的源文件); - 生命周期:程序运行期一直存在; - 引用方法:其他文件要使用必须用extern 关键字声明要引用全局变量

1.1K20

C++C++ 引用详解 ② ( 引用意义 | 引用本质分析 | 引用常量特征 | 引用所占内存空间指针相同 | 引用C++ 编译器实现 | 引用编译时会自动翻译为常量指针 )

使用 指针符号 * 访问数据 ; 2、引用指针对比 引用 指针示例 : 下面的两个函数 , 分别使用 指针引用 作为参数 , 二者实现了相同功能 , 性能也相同 ; 但是使用引用 , 可以像操作变量一样操作外部元素...) { int c = 0; c = *a; *a = *b; *b = c; } 引用示例 : // 交换 a 和 b 值 // C++ 推荐方法 void swap3(int& a,...上述 Student 结构体 , 占 12 字节 内存空间 , int 类型已知占 4 字节 , 剩余 引用 a 和 b 各占 4 字节 , 指针所占内存空间相同 ; 三、引用C++ 编译器实现...; 综合上面的三种特点 , C++ 语言编译器 , 引用本质是 : 类型* const 指针名称; 指针 ; 引用C++ 语言内部是 常量指针 , 下面 C++ 语言 " 引用 " 引用类型...& 引用名称 等同于 下面的 C 语言 " 常量指针 " 指针类型* const 指针名称 C++ 语言中 引用 , 其在 编译器实现 就是 " 常量指针 " , 因此 引用 占用内存空间

26120

设计模式工厂方法抽象工厂之间区别联系

再来看看工厂方法模式抽象工厂模式对比: 工厂方法模式 抽象工厂模式 针对是单个产品等级结构 针对是面向多个产品等级结构 一个抽象产品类 多个抽象产品类 可以派生出多个具体产品类 每个抽象产品类可以派生出多个具体产品类...随着种植厂发展以及市场需求,要增加一种蔬菜类型种植了,茎菜,由于茎菜根菜种植方式不一致,就需要两个专门种植工厂来进行管理,那么此时就采用工厂模式来管理,一个工厂负责一种作物种植,这个时候产品可以理解为仍然在一个层次...但是随着科技发展,我们逐步要种植转基因非转基因食品了,在以前蔬菜种类上又增加了一个层次,这个时候无法将其作为一个层次来解决,所以必须采用抽象工厂方式来解决。 ?...可以从UML图很明显看出来,抽象工厂可以创建多个产品类对象,如在种菜工厂,有种根菜,种茎菜。...工厂模式抽象工厂模式以及简单工厂模式只有在具体应用时候,分析具体产品层级,然后选择相应设计模式

8.2K40

4.2 C++ Boost 内存池管理库

C++,shared_ptr有一种常用设计模式是桥接模式(Bridge Design Pattern)又称为PIMPL模式。...桥接模式主要作用是将实现细节从类接口中分离出来,从而使得接口和实现可以独立变化,提高了类可扩展性和可维护性。...C++,shared_ptr还可以工厂模式(Factory Design Pattern)结合使用,工厂模式是一种创建型设计模式,该模式包装了new操作符使用,使对象创建工作集中在工厂类或工厂函数上...当使用shared_ptr实现工厂模式时,我们可以将工厂创建对象方法返回一个shared_ptr对象,从而避免手动管理动态分配内存。...,我们需要使用weak_ptr智能指针,将原来引用模式改为弱引用模式,即可实现动态释放,循环引用即可消失。

57940

4.2 C++ Boost 内存池管理库

C++,shared_ptr有一种常用设计模式是桥接模式(Bridge Design Pattern)又称为PIMPL模式。...桥接模式主要作用是将实现细节从类接口中分离出来,从而使得接口和实现可以独立变化,提高了类可扩展性和可维护性。...在C++,shared_ptr还可以工厂模式(Factory Design Pattern)结合使用,工厂模式是一种创建型设计模式,该模式包装了new操作符使用,使对象创建工作集中在工厂类或工厂函数上...当使用shared_ptr实现工厂模式时,我们可以将工厂创建对象方法返回一个shared_ptr对象,从而避免手动管理动态分配内存。...,我们需要使用weak_ptr智能指针,将原来引用模式改为弱引用模式,即可实现动态释放,循环引用即可消失。

28420

C++C++ this 指针用法 ③ ( 全局函数 成员函数 相互转化 | 有参构造函数设置默认参数值 | 返回匿名对象返回引用 )

一、全局函数 成员函数 相互转化 1、成员函数转为全局函数 - 多了一个参数 C++ 编译器 , 在编译阶段会将 C++ 成员函数 转为 全局函数 , 转换时 , 会 增加一个参数到参数列表开始为止..., 就是通过 this 指针隐藏左操作数 , 对象本身 就是 左操作数 , 在成员函数 , 通过 this 指针访问对象本身成员 ; 在全局函数 , 实现两个 Student 类相加 , 接收两个...Student 引用类型参数 , 引用相当于一级指针 ; // 全局函数 , 将两个 Student 对象相加 // 引用 等同于 一级指针 , Student 引用用法 Student 对象用法相同...height; // 身高 }; 此时就可以使用默认构造函数 , 创建 Student 对象 ; 三、返回匿名对象返回引用 ---- 在上面的章节 , 将 两个 Student 对象相加 ,..., 将两个 Student 对象相加 // 引用 等同于 一级指针 , Student 引用用法 Student 对象用法相同 // 全局函数 转为 成员函数 , 少了一个参数 Student StudentPlus

17820

C++面试题

(1)、引用指针区别是什么? 指针引用都是地址概念,指针指向一块内存,它内容是所指内存地址;引用是某块内存别名。 程序为指针变量分配内存区域,而不为引用分配内存区域。...int **p //合法 int &&p //非法 ++引用++指针效果不一样。...观察者模式、单例模式工厂模式、状态模式 3、Boost库Singal2信号-槽和Qt信号-槽有什么区别? 4、Qt多线程槽函数是怎么调用,调用时机是什么?...3、模板你在项目中使用多吗? C++面试6 1、派生类怎么调用基类虚函数版本? C++ primer 这本书上有这么两句话“派生类虚函数调用基类版本时,必须显式使用作用操作符。...也就是说: 当你实现派生类B虚函数B::foo()时,如果函数体内需要调用基类虚函数版本时,需要显示使用基类A作用操作符A::foo(),否则foo()就会在派生类作用调用派生类版本虚函数,

2.2K30

React Native for Android源码分析 一《JNI智能指针之介绍篇》

弱全局引用 全局引用一样具有全局作用,但不会影响GC回收, GC可以随时回收该引用对应java object。...由上可见,JNI智能指针第一个需求,就是要自动管理jobject生命周期,当进入离开对应作用时,需要自动调用对应生命周期创建销毁函数。这在C++,通常会结合构造析构函数来进行配对调用。...这样,对jobject访问操作就会被封装在对应镜像C++对象,相关JNI反射调用细节被隐藏,对于其他native模块而言,Java层交互被转化成了这些镜像C++对象交互,整个实现风格OOP...create工厂方法中使用newInstance构建镜像对象实例,并将其存至局部智能指针local_ref。...结尾 ---- 这些问题将在下一篇智能指针具体实现解答。

1.2K50

c++智能指针理解简易实现

总结下个人对智能指针理解,手写一个简易c++实现,最后整理一下相关知识点,有不准确部分欢迎大佬指正。...智能指针利用c++ RAII特性和模板化编程,本质上是一个包装类,使用起来像普通指针一样方便。当最后一个引用动态对象智能指针离开作用或不在引用动态对象后对其进行清理。...--- 智能指针动态对象所有权 就像上面提到,无论是手动管理还是智能指针,都需要在确定最后一个引用该动态对象指针释放后清理。...代码可以看到,使用unique_ptr使用裸指针尺寸相同,空间上没有变化。...使用const声明unique_ptr的话,可以限定资源只作用于当前作用,无法被移动。 weak_ptr只是引用shared_ptr控制块,有一个单独count统计当前控制块引用次数。

73800

ios 笔试题3

(2)在 C 引用 C++语言中函数和变量时,C++头文件需添加 extern "C",但是在 C 语言中不能直接引用声明了 extern "C"该头文件,应该仅将 C 文件中将 C++定义...如果模块以函数实现,那么头文件要按 c格式声明函数,实现文件c++函数内部可以用obj-c,但后缀还是mm或m。...它仍然是个正当对象,因此自动释放池定义作用其它对象可以向它发送消息。当程序执行到作用结束位置 时,自动释放池就会被释放,池中所有对象也就被释放。 1. ...autorelease和release没什么区别,只是引用计数减一时机不同而已,autorelease会在对象使用真正结束时候才做引用计数 减一. 22.类工厂方法是什么  类工厂方法实现是为了向客户提供方便...Objective-C C++ 可混合编程 缺点:  1) 不支援命名空間  2)  不支持运算符重载  3) 不支持多重继承   4) 使用动态运行时类型,所有的方法都是函数调用,所以很多编译时优化方法都用不到

68910

20道必须掌握C++面试题

C程序设计首要考虑是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制),而对于C++,首要考虑是如何构造一个对象模型,让这个模型能够契合之对应问题,这样就可以通过获取对象状态信息得到输出或实现过程...比如工厂模式,定义一个用于创建对象接口,让子类决定实例化哪一个类。Factory Method 使一个类实例化延迟到其子类。...C程序设计首要考虑是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制),而对于C++,首要考虑是如何构造一个对象模型,让这个模型能够契合之对应问题,这样就可以通过获取对象状态信息得到输出或实现过程...在运行时,可以通过指向基类指针,来调用实现派生类方法。 问13:指针引用区别? 答: 1....使用select()或是其它异步方法不同是,一个套接字[socket]一个完成端口关联了起来,然后就可继续进行正常Winsock操作了。

53920

cc++问题集五

都声明在头文件。Class lock_guard是在声明时,自动上锁,在离开作用之后自动析构解锁。...,C++语言支持函数重载,C语言不支持函数重载,函数被C++编译器编译后在库名字C语言不同) 当extern不与“C”在一起修饰变量或函数时,extern int g_Int,他作用是声明变量或者函数为外部变量...单例模式又分为懒汉模式和饿汉模式两种。 单例大约有两种实现方法:懒汉饿汉。 懒汉:故名思义,不到万不得已就不会去实例化类,也就是说在第一次用到类实例时候才会去实例化, 饿汉:饿了肯定要饥不择食。...(1)饿汉 饿汉单例,即在最开始时候,静态对象就已经创建完成; 设计方法是类包含一个静态成员指针,该指针指向该类一个对象,提供一个公有的静态成员方法,返回该对象指针;为了使得对象唯一,还需要将构造函数设为私有...简单工厂模式不同,工厂方法模式对象实例化过程由子类实现

1.1K30

【Android NDK 开发】JNI 引用 ( 局部引用 | 局部引用作用 | 局部引用产生 | 局部引用释放 | 代码示例)

JNI 引用数据类型 II . JNI 引用 指针 III . 局部引用 作用 IV . 局部引用 产生 释放 V . 局部引用 代码示例 I . JNI 引用数据类型 ---- 1 ....Java 数据类型 ; 要注意将 JNI Java 类型引用 , C/C++ 指针区分开 , 两者概念不同 ; 2 ....JNI 引用 指针 ---- 在 JNI 中一定要将 引用指针 区分开 ; 引用 是 Java 语言中概念 , 指针 是 C/C++ 概念 ; JNI Java 引用类型 也是使用...C/C++ 指针表示 , 这个 变量 就有了 两重含义 , 即代表 Java 引用类型 , 又代表了 编程环境 指针 ; 这里注意 , 如果引用被 JVM 释放了 , 即使指针还有值 , 也是不能用于...JNI Java 引用类型 相关方法 ; 本博客只讨论引用相关内容 ; III .

57520

从零开始学C++之类对象:类声明、类作用、前向声明、this指针、嵌套类、PIMPL 技法 等

五、类作用、前向声明 (1)、每个类都定义了自己作用称为类作用,类作用域中说明标识符只在类可见。...:     int num_; }; //num_ = 20;        Error,num_作用在类内部 int num_ = 20;      // num_作用是文件作用...两个类需要相互引用头文件形成一个“环形”引用时会出错。这时候需要用到前向声明,前向声明类不能实例,但可以定义指针引用。...从作用角度看,嵌套类被隐藏在外围类之中,该类名只能在外围类中使用。如果在外围类之外作用使用该类名时,需要加名字限定。 嵌套类成员函数可以在它类体外定义。...如果X 有子类,通过基类指针px_  还可以实现虚函数多态。 参考: C++ primer 第四版 Effective C++ 3rd C++编程规范

1.4K00

c++lambda使用注意事项,可能导致崩溃问题分析

以上示例崩溃原因都可以归结为使用了悬空引用。需要特别注意悬空引用。 悬空引用 引用捕获会导致闭包包含一个局部变量引用或者一个形参引用(在定义lamda作用)。...Effective Modern C++ 条款31 对于lambda表达式,避免使用默认捕获模式。 5、避免使用默认捕获模式((即“[=]”或“[&]”,它可能导致你看不出悬空引用问题)。...6、注意捕获是可见(在创建lambda作用可见)非static局部变量(包含形参)。 每一个非static成员函数都有一个this指针,然后每当你使用类成员变量时都用到这个指针。...这时候lambda闭包活性Widget对象生命期有紧密关系,闭包内含有Widgetthis指针拷贝。...正常情况下,lambda表达式访问类对象成员变量需要捕获this,但是这里捕获是this指针,指向是对象引用,正常情况下可能没问题,但是如果多线程情况下,函数作用超过了对象作用,对象已经被析构了

3.4K10

2023学习日志

,自动释放堆上数据在超出作用后,栈上数据都会被逐一清除,而Box智能指针在清除之前会调用其实现Drop traitdrop函数,清除所指向堆上数据。...(5, *y); }Drop Trait 自动清除数据Drop trait 类似于c++析构函数,在变量离开作用时调用,清除数据或进行一些其他操作。...(主要目的为清理该变量拥有的数据)此外,还可通过std::mem::drop 来在作用结束前释放变量,std::mem::drop位于prelude,因此无需显式引入该方法。...可以通过克隆Rc方式获取对堆上数据引用,每次克隆时,引用计数增加1,当一个Rc指针离开作用时,引用计数减1,而当引用计数为0时,对应drop方法将会被调用,堆上数据将会被清理。...RefCell记录当前有多少个活动Ref和RefMut智能指针,每次调用borrow方法,RefCell将不可变借用计数加一,当Ref指针离开作用时,不可变计数减一。

13610

RUST 语言特性之所有权

新年开工,开启 work & study 模式,接着来学习 RUST 语言。 作为一名 C/C++ 程序员,C/C++ 语言中指针是使用得最爽,几乎无所不能,各种奇技淫巧也层出不穷。...但 C/C++ 语言中最折磨人也是指针,伴随着开发过程就是和指针导致内存问题做斗争。 也许是意识到指针巨大杀伤力,现代语言中都不再提供指针特性,改为引用和托管指针。...这个比较容易理解,在 Java 和 C++ 语言中都有作用概念,比如在一段程序块(通常使用一对大括号包括起来)声明变量,在程序块外面无法使用。...对,许多技术就是这样相通,假如你在 C++ 中使用过类似的模式,那么理解 当所有者离开自己作用时,它持有的值就会被释放掉 这条规则就容易得多。...其实在 C++ ,设计对象深拷贝和浅拷贝同样存在考量。 所有权函数 在 C++ ,将指针问题复杂化一个因素就是各种函数调用返回,RUST 语言同样如此。

75760

C++核心准则R.31:如果需要实现标准库以外智能指针,遵照标准库基本模式

R.31: If you have non-std smart pointers, follow the basic pattern from std R.31:如果需要实现标准库以外智能指针,遵照标准库基本模式...后面章节准则也适用于其他类型第三方和自定义智能指针,它们对于发现一般可能导致性能和正确性问题智能指针错误很有效。你需要是对所有智能指针都有效准则。...(包括主要模板和特化)都可以看作智能指针。...两种情况都犯了sharedptrParam准则指出错误:p是一个共享指针,但是这里没有用到任何有关共享功能。...而且通过传值方式传递智能指针是一种默认许可;这个函数应该只在参与widget生命周期管理时才接受智能指针。其他情况下:如果函数允许为空,它们应该接受widget*,否则应该接受widget&。

38920
领券