首先呢,给大家分享一个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语言实现工厂模式相关推荐

  1. C语言实现简单工厂模式

    1.简单工厂模式 工厂模式是面向对象语言的20多种的设计模式之一,也是比较常用,虽然C语言是一个面向过程的语言,但通过结构体与指针也能实现一些简单的面向对象.基于此,玩了一下C语言简单工厂模式. 工厂 ...

  2. 【设计模式自习室】理解工厂模式的三种形式

    前言 <设计模式自习室>系列,顾名思义,本系列文章带你温习常见的设计模式.主要内容有: 该模式的介绍,包括: 引子.意图(大白话解释) 类图.时序图(理论规范) 该模式的代码示例:熟悉该模 ...

  3. 【Golang第8章:面向对象编程】Go语言的结构体是什么,怎么声明;Golang方法的调用和声明;go语言面向对象实例,go语言工厂模式;golang面向对象的三大特性:继承、封装、多态

    介绍 这个是在B站上看边看视频边做的笔记,这一章是Glang面向对象编程 这一章内容较多,内容有Go语言的结构体是什么,怎么声明:Golang方法的调用和声明:go语言面向对象实例,go语言工厂模式: ...

  4. 用C语言实现简单工厂模式!

    用C语言实现简单工厂模式! 一.背景介绍 在我们的印象中,设计模式是由面向对象的语言(C++.JAVA)才能完成的,而C语言是面向过程的语言,不能实现设计模式.C语言中有 函数指针.回调函数 等机制, ...

  5. C语言和设计模式(抽象工厂模式)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前面我们写过的工厂模式实际上是对产品的抽象.对于不同的用户需求,我们可以给予不同的产品,而且这 ...

  6. C语言和设计模式(工厂模式)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 工厂模式是比较简单,也是比较好用的一种方式.根本上说,工厂模式的目的就根据不同的要求输出不同的 ...

  7. 简单工厂模式(C语言实现)

    工厂模式属于创建型模式,大致可以分为三类,简单工厂模式.工厂方法模式.抽象工厂模式. 一. 简单工厂模式 简单工厂模式,它的主要特点是需要在工厂类中做判断,从而创造相应的产品.当增加新的产品时,就需要 ...

  8. 【Spring】工厂模式解耦

    问题: 程序的耦合    耦合:程序间的依赖关系    包括:类之间的依赖       方法之间的依赖 解耦:降低程序之间的耦合关系    实际开发:编译期不依赖,运行期才依赖    解耦思路:    ...

  9. 编程模式 之美 -- 抽象工厂模式

    文章目录 1. 解决问题 2. 应用场景 3. 实现如下: C++实现 C语言实现 4. 缺点 1. 解决问题 在工厂方法模式中,我们卖衣服.此时我们为每一种衣服创建不同的工厂,帽子有一个工厂专门创建 ...

最新文章

  1. DayDayUp:《P2P行业最高端的玩法》源于网友网络收集
  2. 揭开互联网公司的神秘面纱,数据解读那些slay整个行业的互联网公司
  3. vrep和matlab,VREP与MATLAB联合仿真程序--UR5机械臂动力学控制
  4. python怎样遍历列表中数字_关于Python列表的遍历和数字列表
  5. MongoDB查询文档(非常详细,不要错过哦~)
  6. Windows下编译FFmpeg-2.6.1详解
  7. Java的GUI学习十一(编程菜单)
  8. 前后端分离项目部署_不用Docker前后端分离项目如何快速部署
  9. 在IDEA中调试JavaScript代码
  10. 软件测试-禅道下载及安装-测试人员必会工具
  11. 平板电脑怎么使用计算机,平板电脑怎么用
  12. getbook netty实战_《Netty实战》Netty In Action中文版 第1章 Netty——异步和事件驱动...
  13. 红冲发票,负数发票,作废发票
  14. 【摘抄】每一位测试必备保健技能
  15. Android深入浅出系列课程---Lesson13 LLY110529_虚拟机概述,JIT概述
  16. 帝国cms php循环,帝国CMS listshowclass循环栏目标签
  17. Unity 性能优化:资源篇
  18. 2012年中国285个地级市名单、各地级市对应车牌号代码
  19. 使用MATLAB计算一幅图像的熵
  20. 视口锁定解锁lisp_CAD锁定和解锁视口的快捷键分别是什么

热门文章

  1. 关于cordova打包的android项目,禁止随手机系统改变字体大小的解决方法
  2. 洋灰三角 矩阵快速幂
  3. 内连接与外连接-及其典型案例
  4. 响应式网页设计_响应式网页设计的意义和目的
  5. 分枝定界法的一般步骤
  6. MySql中delimiter的用法
  7. 吴恩达机器学习笔记(一)
  8. 芯圣SQ013单片机IO口模拟串口 延时法
  9. Markdown笔记软件 - Vnote 修改“标题“的渲染样式
  10. hualinux0.10 网络篇:如何学好CCNA(网络入门的正确打开方式)