C++面向对象的工厂方法模式demo

时间: 2023-08-31 22:31:42 浏览: 64
### 回答1: 下面是一个使用 C 语言实现面向对象的工厂方法模式的简单示例: ``` #include <stdio.h> #include <stdlib.h> typedef struct Product Product; struct Product { void (*use)(Product*); }; typedef struct ConcreteProductA ConcreteProductA; struct ConcreteProductA { Product product; int concrete_a_data; }; void concrete_product_a_use(Product* product) { ConcreteProductA* concrete_product_a = (ConcreteProductA*) product; printf("ConcreteProductA use, concrete_a_data = %d\n", concrete_product_a->concrete_a_data); } typedef struct ConcreteProductB ConcreteProductB; struct ConcreteProductB { Product product; int concrete_b_data; }; void concrete_product_b_use(Product* product) { ConcreteProductB* concrete_product_b = (ConcreteProductB*) product; printf("ConcreteProductB use, concrete_b_data = %d\n", concrete_product_b->concrete_b_data); } typedef struct Creator Creator; struct Creator { Product* (*factory_method)(); }; typedef struct ConcreteCreatorA ConcreteCreatorA; struct ConcreteCreatorA { Creator creator; }; Product* concrete_creator_a_factory_method() { ConcreteProductA* concrete_product_a = (ConcreteProductA*) malloc(sizeof(ConcreteProductA)); concrete_product_a->product.use = concrete_product_a_use; concrete_product_a->concrete_a_data = rand() % 100; return (Product*) concrete_product_a; } typedef struct ConcreteCreatorB ConcreteCreatorB; struct ConcreteCreatorB { Creator creator; }; Product* concrete_creator_b_factory_method() { ConcreteProductB* concrete_product_b = (ConcreteProductB*) malloc(sizeof(ConcreteProductB)); concrete_product_b->product.use = concrete_product_b_use; concrete_product_b->concrete_b_data = rand() % 100; return (Product*) concrete_product_b; } int main() { Creator* creator = (Creator*) malloc(sizeof(ConcreteCreatorA)); creator->factory_method = concrete_creator_a_factory_method; Product* product = creator->factory_method(); product->use(product); free(product); creator = (Creator*) malloc(sizeof(ConcreteCreatorB)); creator->factory_method = concrete_creator_b_factory_method; product = creator->factory_method(); product->use(product); free(product); free(creator); ### 回答2: 面向对象的工厂方法模式是一种创建型设计模式,它将对象的创建委托给工厂类,实现了对象的创建与使用的分离,可以灵活地添加新的产品类型而无需修改客户端代码。 以一个简单的图形绘制工具为例,我们可以使用工厂方法模式实现对不同图形对象的创建。 首先,我们定义一个抽象的图形类,包含绘制方法draw(): class Shape { public abstract void draw(); } 然后,定义不同的具体图形类,继承自抽象图形类: class Rectangle extends Shape { public void draw() { // 绘制矩形的具体实现 } } class Circle extends Shape { public void draw() { // 绘制圆形的具体实现 } } 接下来,我们定义一个抽象的图形工厂类,包含创建图形对象的方法createShape(): class ShapeFactory { public abstract Shape createShape(); } 然后,定义不同的具体图形工厂类,继承自抽象图形工厂类: class RectangleFactory extends ShapeFactory { public Shape createShape() { return new Rectangle(); } } class CircleFactory extends ShapeFactory { public Shape createShape() { return new Circle(); } } 最后,我们可以在客户端代码中通过具体的工厂类创建具体的图形对象并调用相应的方法: ShapeFactory factory = new RectangleFactory(); Shape shape = factory.createShape(); shape.draw(); 这样,通过工厂方法模式,我们可以实现对不同图形对象的创建和使用的解耦,从而提高了系统的扩展性和灵活性。 ### 回答3: 工厂方法模式是一种创建型设计模式,用于解耦具体对象的创建和使用。在面向对象的编程中,通常需要通过实例化具体的对象来完成某个功能,这会导致代码耦合度高、可维护性差。而工厂方法模式通过定义一个抽象工厂类,让子类具体实现创建对象的方法,以达到解耦的效果。 下面以一个计算器为例来演示工厂方法模式的使用。 首先,我们定义一个抽象的计算器接口Calculator,其中包含了两个方法:add和subtract。 接着,我们创建两个具体类CalculatorAdd和CalculatorSubtract,它们分别实现了Calculator接口,并分别实现了add和subtract方法,用于进行加法和减法运算。 然后,我们创建一个抽象工厂类CalculatorFactory,其中包含一个创建计算器的抽象方法createCalculator。 最后,我们创建两个具体工厂类CalculatorAddFactory和CalculatorSubtractFactory,它们分别实现了CalculatorFactory接口,并实现了createCalculator方法,分别用来创建加法计算器和减法计算器的对象。 这样,当我们需要使用计算器时,只需通过具体工厂类创建对应的计算器对象,并直接使用其方法进行计算,无需关心具体对象的创建细节。 工厂方法模式可以将对象的创建和使用分离开来,提高代码的可维护性和可扩展性。当需要新增一种计算器时,只需创建一个新的具体工厂类和计算器类,并通过扩展抽象工厂类和接口来完成,无需修改已有的代码。同时,也方便进行单元测试和代码的复用。 总之,工厂方法模式是一种常用的设计模式,在面向对象的编程中具有重要的应用价值。

相关推荐

最新推荐

recommend-type

C++面向对象实现五子棋小游戏

本文介绍了如何运用面向对象思想进行五子棋游戏的设计与开发,与面向过程程序设计比较,面向对象程序设计更易于实现对现实世界的描述,提高软件的扩展性和可维护性。附上最终的程序源码,推荐给大家,有需要的小伙伴...
recommend-type

【长春理工大学】面向对象程序设计下期末复习浏览题.pdf

这个是我本人在大一下学期期间整理的C++题库,涵盖机考(2018级及以后的南区软件工大一下学期程面向对象程序设计期末考试题库)中几乎所有的题目,并配有解析,方便记忆,考试这个东西……最主要还是自己会,我自己...
recommend-type

C++_面向对象程序设计_谭浩强 word完整版

第1篇 基 本 知 识 第1章 C++的初步知识 第2章 数据类型与表达式 第2篇 面向过程的程序设计 ... 第4篇 面向对象的程序设计 第11章 继承与派生 第12章 多态性与虚函数 第13章 输入输出流 第14章 C++工具
recommend-type

解决C++中重定义的方法总结

本篇文章是对C++中重定义的解决方法进行了详细的分析介绍,需要的朋友参考下
recommend-type

C++面向对象程序设计综合复习题

里面有200多条单项选择题,200多条填空题,和30题经典程序填充题,特别适合计算机专业的学生用于复习,附有答案
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

如何用python编写api接口

在Python中编写API接口可以使用多种框架,其中比较流行的有Flask和Django。这里以Flask框架为例,简单介绍如何编写API接口。 1. 安装Flask框架 使用pip命令安装Flask框架: ``` pip install flask ``` 2. 编写API接口 创建一个Python文件,例如app.py,编写以下代码: ```python from flask import Flask, jsonify app = Flask(__name__) @app.route('/api/hello', methods=['GET']) def hello():
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。