首页 > 其他分享 >C语言工厂模式

C语言工厂模式

时间:2023-07-10 22:33:35浏览次数:32  
标签:NULL return struct void Shape 模式 工厂 shape C语言

前言

​ 工厂模式是在软件设计中常常使用一种设计模式。

​ 在使用工厂模式进行软件开发,在创建对象的过程中,不会对客户端暴露具体的逻辑实现,而是使用一个共有的接口来指向创建的对象。 通过这样的方式进行软件开发好处是,可以在不修改原本的代码的基础上加入新的产品,满足软件设计的开闭原则。

工厂模式的优点

  • 使用者在创建对象时,只需要知道该对象的名称即可。
  • 代码的扩展性强,如果需要增加一个新的产品,只需要增加一个实现即可。
  • 将代码的具体的实现和抽象接口分离。接口一致对外,实现可以根据需求的不同实现不同,实现层与层之间的解耦。

工厂模式的缺点

  • 产品增加时,对应的实现会变多,系统的复杂度会增加。
  • 实现和接口分离,可能使得代码变得相对不易理解。

应用场景

  • 一个系统要独立于它的产品的创建、组合和表示,即要将具体产品类分离出来。
  • 一个系统要有多个产品系列中的一个来配置,即系统有多个产品系列,但只使用一个产品系列。
  • 提供一个产品类库,但只想显示它们的接口而不是实现。

案例

​ 为了说明工厂模式,我这里举一个比较简单的例子。假设有shape这个接口,然后根据业务的不同有可能需要circle的实现方式也有可能时square的实现方式,当然也有可能时其他的具体形状,但是抽象出现就是一个形状和将这形状绘制的函数draw即可。

​ 创建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");

}

标签:NULL,return,struct,void,Shape,模式,工厂,shape,C语言
From: https://www.cnblogs.com/Kroner/p/17542554.html

相关文章

  • c语言学习3
    一、for循环语句循环:就是一种让一段代码反复执行的方式,从而达到想要的效果for循环一般会使用一个变量来引导循环的进行,这个变量叫做该循环的循环变量iindexfor循环的变化很灵活,但也很危险(相比于其他循环)for([1];[2];[3]){[4]}[1]、给循......
  • 重温设计模式 --- 适配器模式
    引言适配器模式是一种结构型设计模式,用于将一个类的接口转换成另一个接口,以便于两个不兼容的类之间能够协同工作。适配器模式可以被认为是一个桥梁,它可以连接两个不同的接口,从而使得它们可以进行协同工作。适配器模式通常在两个不兼容的类之间进行转换,这些类可能具有不同的接口,......
  • C语言中 #pragma pack()
    #pragma pack    这条指令主要用作改变编译器的默认对齐方式。 pragmapack(show)     //显示当前内存对齐的字节数,编辑器默认8字节对齐   #pragmapack(n)        //设置编辑器按照n个字节对齐,n可以取值1,2,4,8,16   #pragmapack(push)  ......
  • 重温设计模式 --- 原型模式
    引言原型模式是一种创建型设计模式,它允许我们创建一个对象的副本,而不需要显式地使用构造函数来创建一个新的对象。这种模式通常用于创建那些具有复杂创建过程或需要大量资源的对象。在原型模式中,我们首先定义一个原型接口,该接口包含一个克隆方法。然后我们创建一个原型对象,该对......
  • 在WPF中判断是是否为设计时模式
    方式一:   usingSystem.ComponentModel;   privateboolIsInDesignMode { get{returnDesignerProperties.GetIsInDesignMode(this);} } 此方式适用于当前对象在设计器中查看,而且是DependenceObject类型对象。 如果该......
  • 如何用C++11实现观察者模式
    观察者模式是一种设计模式,定义了对象之间的一对多关系。当一个对象状态发生改变时,它的依赖者都会收到通知并自动更新。在C++11中,可以通过以下方式实现观察者模式:首先,我们需要创建一个观察者接口,其中包含一个更新方法。这个接口可以被多个观察者类实现,从而实现多态。#include<iostr......
  • C++类模板实现工厂模式(优化if else/switch case)
    引自:https://blog.csdn.net/weixin_43795921/article/details/127224633template<typenameIdentifierType,classAbstractProduct,classProductCreator=AbstractProduct*(*)(),classMapContainer=std::map<IdentifierType,ProductCreato......
  • 虹科 智能制造工厂的SCADA解决方案应用
    智能制造工厂的SCADA解决方案应用 智能制造工厂是当今工业领域的一个重要趋势,它将传统的生产模式与现代信息技术相结合,实现了生产过程的智能化和自动化。SCADA是一种监控与数据采集系统,广泛应用于工业自动化领域,它通过传感器、控制器和网络等设备,实时采集、传输和处......
  • c语言学习2
    一、数据类型为什么要对数据进行分类?1、现实中的数据就是自带类别属性的2、对数据进行分类可以节约内存存储空间、提高运行速度存储空间的单位:Bit比特存储一个二进制位,只能存储0或者1,计算机存储数据的最小单位Byte字节存储八个二进制位,计算机存储数据的基本单位Kb102......
  • 重温设计模式 --- 单例模式
    引言单例模式是一种创建型设计模式,它的主要目的是确保某个类在应用程序中只有一个实例,并且这个实例能够被全局访问。在许多情况下,单例模式是非常有用的,比如说当你需要创建一个全局的配置类或者日志类时,单例模式可以让你轻松地实现这些功能。在实现单例模式时,有两种常见的方法,“......