使用C语言实现工厂模式
首先呢,给大家分享一个C语言练习的网站:C语言练习
工厂模式是软件设计中经常使用到的设计模式之一。
使用工厂模式时,在创建对象的过程中,不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
使用该模式的好处是,可以在不修改原有代码的基础上加入新的产品,满足软件设计的开闭原则。
优点
- 使用者在创建对象时,只需要知道该对象的名称即可。
- 代码扩展性强,如果想要增加一个新产品,只需要再增加一个类即可。
- 使代码得到解耦。
缺点
- 产品增多时,对应的类将会变多,增加了系统的复杂度。
- 增加了系统的抽象性,使之不好理解
应用场景
- 一个系统要独立于它的产品的创建、组合和表示,即要将具体产品类分离出来。
- 一个系统要有多个产品系列中的一个来配置,即系统有多个产品系列,但只使用一个产品系列。
- 提供一个产品类库,但只想显示它们的接口而不是实现。
实现
代码在文末下载
创建Shape接口并实现
typedef struct Shape Shape;struct Shape {void *priv_;void (*Draw)(struct Shape *c_this);void (*Destroy)(struct Shape *c_this);
};void ShapeDraw(Shape *c_this);
void ShapeDestory(Shape **c_this);
void ShapeDraw(Shape *c_this) {assert(c_this != NULL);if(c_this->Draw != NULL) {c_this->Draw(c_this);}
}
void ShapeDestory(Shape **c_this) {if(c_this == NULL || *c_this == NULL) {return;}Shape *shape = *c_this;if(shape->Destroy != NULL) {shape->Destroy(shape);}free(*c_this);*c_this = NULL;
}
- 创建并实现工厂类ShapeFactory
#include "shape.h"
Shape* ShapeFactoryCreateShape(const char *shape_type);
extern struct Shape* CircleCreate(void);
extern struct Shape* RectangleCreate(void);
extern struct Shape* SquareCreate(void);Shape* ShapeFactoryCreateShape(const char *shape_type) {if(shape_type == NULL) {return NULL;}if (0 == strcasecmp("CIRCLE", shape_type)) {return CircleCreate();} else if (0 == strcasecmp("RECTANGLE", shape_type)) {return RectangleCreate();} else if (0 == strcasecmp("SQUARE", shape_type)) {return SquareCreate();} else {return NULL;}
}
- 创建实现接口的实体类
//1.Circle类
static void CircleDraw(struct Shape *c_this) {printf("Circle draw method.\n");
}struct Shape *CircleCreate(void) {struct Shape *c_this = (struct Shape *)malloc(sizeof(struct Shape));if(c_this == NULL) {return NULL;;}memset(c_this, 0, sizeof(struct Shape));c_this->Draw = CircleDraw;return c_this;
}
//2.Rectangle类
static void RectangleDraw(struct Shape *c_this) {printf("Rectangle draw method.\n");
}struct Shape *RectangleCreate(void) {struct Shape *c_this = (struct Shape *)malloc(sizeof(struct Shape));if(c_this == NULL) {return NULL;;}memset(c_this, 0, sizeof(struct Shape));c_this->Draw = RectangleDraw;return c_this;
}
//3.Square类
static void SquareDraw(struct Shape *c_this) {printf("Square draw method.\n");
}struct Shape *SquareCreate(void) {struct Shape *c_this = (struct Shape *)malloc(sizeof(struct Shape));if(c_this == NULL) {return NULL;;}memset(c_this, 0, sizeof(struct Shape));c_this->Draw = SquareDraw;return c_this;
}
- FactoryPatternDemo类使用ShapeFactory来获取Shape对象
void main(void) {//获取 Circle 的对象,并调用它的 draw 方法Shape* circle_shape = ShapeFactoryCreateShape("CIRCLE");ShapeDraw(circle_shape);ShapeDestory(&circle_shape);//获取 Rectangle 的对象,并调用它的 draw 方法Shape* rectangle_shape = ShapeFactoryCreateShape("RECTANGLE");ShapeDraw(rectangle_shape);ShapeDestory(&rectangle_shape);//获取 Square 的对象,并调用它的 draw 方法Shape* square_shape = ShapeFactoryCreateShape("SQUARE");ShapeDraw(square_shape);ShapeDestory(&square_shape);system("pause");
}
- 代码仓库:https://github.com/Lighter-z/DesignPattern
使用C语言实现工厂模式相关推荐
- C语言实现简单工厂模式
1.简单工厂模式 工厂模式是面向对象语言的20多种的设计模式之一,也是比较常用,虽然C语言是一个面向过程的语言,但通过结构体与指针也能实现一些简单的面向对象.基于此,玩了一下C语言简单工厂模式. 工厂 ...
- 【设计模式自习室】理解工厂模式的三种形式
前言 <设计模式自习室>系列,顾名思义,本系列文章带你温习常见的设计模式.主要内容有: 该模式的介绍,包括: 引子.意图(大白话解释) 类图.时序图(理论规范) 该模式的代码示例:熟悉该模 ...
- 【Golang第8章:面向对象编程】Go语言的结构体是什么,怎么声明;Golang方法的调用和声明;go语言面向对象实例,go语言工厂模式;golang面向对象的三大特性:继承、封装、多态
介绍 这个是在B站上看边看视频边做的笔记,这一章是Glang面向对象编程 这一章内容较多,内容有Go语言的结构体是什么,怎么声明:Golang方法的调用和声明:go语言面向对象实例,go语言工厂模式: ...
- 用C语言实现简单工厂模式!
用C语言实现简单工厂模式! 一.背景介绍 在我们的印象中,设计模式是由面向对象的语言(C++.JAVA)才能完成的,而C语言是面向过程的语言,不能实现设计模式.C语言中有 函数指针.回调函数 等机制, ...
- C语言和设计模式(抽象工厂模式)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 前面我们写过的工厂模式实际上是对产品的抽象.对于不同的用户需求,我们可以给予不同的产品,而且这 ...
- C语言和设计模式(工厂模式)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 工厂模式是比较简单,也是比较好用的一种方式.根本上说,工厂模式的目的就根据不同的要求输出不同的 ...
- 简单工厂模式(C语言实现)
工厂模式属于创建型模式,大致可以分为三类,简单工厂模式.工厂方法模式.抽象工厂模式. 一. 简单工厂模式 简单工厂模式,它的主要特点是需要在工厂类中做判断,从而创造相应的产品.当增加新的产品时,就需要 ...
- 【Spring】工厂模式解耦
问题: 程序的耦合 耦合:程序间的依赖关系 包括:类之间的依赖 方法之间的依赖 解耦:降低程序之间的耦合关系 实际开发:编译期不依赖,运行期才依赖 解耦思路: ...
- 编程模式 之美 -- 抽象工厂模式
文章目录 1. 解决问题 2. 应用场景 3. 实现如下: C++实现 C语言实现 4. 缺点 1. 解决问题 在工厂方法模式中,我们卖衣服.此时我们为每一种衣服创建不同的工厂,帽子有一个工厂专门创建 ...
最新文章
- DayDayUp:《P2P行业最高端的玩法》源于网友网络收集
- 揭开互联网公司的神秘面纱,数据解读那些slay整个行业的互联网公司
- vrep和matlab,VREP与MATLAB联合仿真程序--UR5机械臂动力学控制
- python怎样遍历列表中数字_关于Python列表的遍历和数字列表
- MongoDB查询文档(非常详细,不要错过哦~)
- Windows下编译FFmpeg-2.6.1详解
- Java的GUI学习十一(编程菜单)
- 前后端分离项目部署_不用Docker前后端分离项目如何快速部署
- 在IDEA中调试JavaScript代码
- 软件测试-禅道下载及安装-测试人员必会工具
- 平板电脑怎么使用计算机,平板电脑怎么用
- getbook netty实战_《Netty实战》Netty In Action中文版 第1章 Netty——异步和事件驱动...
- 红冲发票,负数发票,作废发票
- 【摘抄】每一位测试必备保健技能
- Android深入浅出系列课程---Lesson13 LLY110529_虚拟机概述,JIT概述
- 帝国cms php循环,帝国CMS listshowclass循环栏目标签
- Unity 性能优化:资源篇
- 2012年中国285个地级市名单、各地级市对应车牌号代码
- 使用MATLAB计算一幅图像的熵
- 视口锁定解锁lisp_CAD锁定和解锁视口的快捷键分别是什么