首页
学习
活动
专区
工具
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++编程语言中,引用和指针是两种常见的数据类型,用于处理内存中的对象。虽然它们都可以被用来传递参数并修改变量的值,但它们之间有一些重要的区别。...本文将详细介绍引用和指针在C++中的概念以及它们的用法,并结合一个经典的示例——swap函数进行说明。 引用 引用是C++中非常重要的概念之一。...引用与指针的比较 虽然引用和指针都可以用于修改变量的值,并且在函数参数传递中起到类似的作用,但它们之间有几个重要的区别: 在创建时,引用必须初始化,并且不能更改指向的对象,而指针可以在任何时候重新赋值。...结论 引用和指针是C++中非常重要的概念,可用于处理内存中的对象。引用提供了一种安全且简单的方式访问和修改对象的值,而指针则提供了更大的灵活性,并通过间接操作对象来实现对其值的修改。...根据具体情况和需求,我们可以选择使用适合的方法来管理对象及其值的访问与修改。 希望本文能够帮助你更好地理解C++中的引用和指针的概念,并在日后的编程中正确而高效地使用它们。

8710

C++中引用与指针的区别

在C++中,引用和指针是两种不同的机制,用于访问和操作对象。它们有以下主要区别:定义和初始化:引用:引用必须在定义时初始化,并且一旦初始化后就不能改变引用的对象。...int x = 10;int& ref = x; // 引用必须在定义时初始化int* ptr = &x; // 指针可以在定义时初始化语法和使用:引用:引用的使用方式与普通变量相同,不需要解引用操作。...指针:指针需要通过解引用操作符 * 来访问指向的对象。...int y = 20;ref = y; // 直接赋值,改变引用的对象*ptr = y; // 解引用后赋值,改变指针指向的对象空值:引用:引用不能为 nullptr,必须始终引用一个有效的对象。...int z = 30;ref = z; // 改变引用的对象,实际上是改变 x 的值ptr = &z; // 指针重新指向另一个对象内存占用:引用:引用通常不占用额外的内存,它只是一个别名。

6410
  • 从实现装饰者模式中思考C++指针和引用的选择

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

    1.1K100

    C++中的作用域与生命周期

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

    1.2K20

    【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++ 语言中的 引用 , 其在 编译器中的实现 就是 " 常量指针 " , 因此 引用 占用的内存空间与

    38520

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

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

    8.5K40

    4.2 C++ Boost 内存池管理库

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

    91540

    4.2 C++ Boost 内存池管理库

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

    34920

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

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

    23820

    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.3K30

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

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

    1.3K50

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

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

    76800

    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) 使用动态运行时类型,所有的方法都是函数调用,所以很多编译时优化方法都用不到

    73310

    Rust避坑现代C++悬垂指针

    实现观察者模式等设计模式。管理有多个所有者的资源。weak_ptr是一种不控制所指向对象生存期的智能指针,它指向一个由shared_ptr管理的对象。它不增加引用计数。...可以通过lock()方法来获取一个shared_ptr。weak_ptr适用于以下场景。解决shared_ptr循环引用问题。观察者模式中的弱引用。缓存实现。...这种声明后延迟初始化的模式在Rust中是允许的,但要确保在使用变量之前对其进行赋值。编译器此时会进行流程分析,确保变量在被使用前已经被初始化。第6行开始一个新的作用域,用花括号 {} 包围。...在实现某些设计模式(如状态模式)时很有用。第8行从 smart_ptr 中获取一个不可变引用,并赋值给 reference。&*smart_ptr 首先解引用 Box,然后再创建引用。下面逐步解释。...第14行作用域结束,smart_ptr被销毁,其指向的内存被释放。第16-19行尝试使用已经变成悬垂指针的raw_ptr,即在unsafe块中尝试解引用并打印raw_ptr指向的值。

    58161

    智能指针:从基础、使用选择到原理

    C++11引入了智能指针的概念,它是一种对象,当其作用域结束时,它会自动删除所指向的对象。智能指针有助于防止内存泄漏,它们封装了原始指针,使得内存管理更加自动化。...,MyClass对象的计数器变为1} // ptr离开作用域,MyClass对象的计数器变为0,对象被删除在这个例子中,当ptr2离开其作用域时,MyClass对象不会被删除,因为ptr仍然在管理它。...智能指针的底层实现原理智能指针的底层实现原理主要依赖于两个C++特性:模板和析构函数。模板:智能指针是模板类,可以接受任何类型的原始指针。...实现在构造函数中接受一个原始指针,并初始化引用计数为1。...在析构函数中,它会减少引用计数,如果引用计数为0,就删除所指向的对象。在复制构造函数中,它会增加引用计数。智能指针的设计模式智能指针的实现使用了设计模式中的“策略模式”。

    9200

    cc++问题集五

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

    1.1K30

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

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

    56520

    十一、多态

    作用:继承为子类提供了重写基类方法的能力,是实现多态的基础。 虚函数 说明:在基类中,需要有一个或多个被声明为virtual的函数,这些函数被称为虚函数。子类可以重写这些虚函数,以提供特定的实现。...指针或引用调用:通过基类类型的指针或引用来调用虚函数,实现多态。 这三个要素共同作用,使得C++中的多态成为可能,从而提高了代码的复用性、扩展性和灵活性。...模板方法模式:在模板方法模式中,抽象类定义了一个算法的骨架,将一些步骤延迟到子类中实现。纯虚函数用于定义这些必须由子类实现的步骤。...然后,可以定义一个比萨工厂类(PizzaFactory),根据用户的输入产生具体的比萨对象,并通过基类类型的引用或指针来调用show方法,展示不同比萨的信息。这就是多态在实际应用中的一个典型例子。...构造和析构过程中虚函数表指针的行为是特殊的,需要特别注意。 总之,虚函数表指针是C++多态性实现的底层机制之一,它使得通过基类指针或引用来调用虚函数时,能够根据对象的实际类型来调用相应的函数实现。

    10110

    【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 .

    62220
    领券