设计模式:简单工厂模式——基于C语言

设计模式:简单工厂模式——基于C语言

背景

  看了刘伟、胡志刚的《C#设计模式(第二版)》——清华大学出版社,利用里面阐述的简单工厂模式创造一个属于C语言的精简版本。我们知道简单的工厂模式是定义一个工厂类,它可以根据参数的不同返回不同类的实例,而被创建的实例通常都具有共同的父类。关于C语言的解释,我是这么认为的。一个工厂能够根据不同的产品名称产生一个产品数据类型(父类)的有效变量(实例)。现在设计一个简单工厂模式的实例。若现在单片机要做一个指示的功能,指示功能可以是点亮ON_LED、熄灭OFF_LED、翻转TOG_LED。那么C代码该如何实现尼?话不多说,直接撸!!

创建一个抽象产品角色

typedef void (*FuncTPDF)(void);   ///<定义一个函数指针

typedef struct 
{
	FuncTPDF  DisplayLed;
}DisplayLedTPDF;

创建父类,给出操作方法参数——显示;这是一个抽象的操作方法,并没有去实现它。

创建具体产品角色

//DisplayLedTPDF  ON_LED;	  ///<定义一个开灯的产品
//DisplayLedTPDF  OFF_LED;	///<定义一个关灯的产品
//DisplayLedTPDF  Tog_LED;	///<定义一个闪烁灯的产品

void OnledRealize(void)
{
	 bsp_board_led_on(2);  ///<打开2号灯
}

void OffledRealize(void)
{
	 bsp_board_led_off(2); ///<关闭2号灯
}

void TogledRealize(void)
{
	 bsp_board_led_invert(2);///<翻转2号灯
}

创造具体函数实现

创建工厂

DisplayLedTPDF  ChoiceDisplay (uint8_t name)
{
	DisplayLedTPDF product;
	if( name == 1)
	{
		product.DisplayLed = &OnledRealize;
	}
	else if(name == 2)
	{
		product.DisplayLed = &OffledRealize;
	}
	else if(name == 3)
	{
		product.DisplayLed = &TogledRealize;
	}
	return product;
}

在工厂中,根据不同的产品名称,给出对应的产品实例

User端使用

#define OFF_LED
#ifdef  ON_LED 
	#define  FUNCNAME     1
#endif
#ifdef	OFF_LED
	#define  FUNCNAME     2
#endif
#ifdef	TOG_LED	
	#define  FUNCNAME     3
#endif

void main()
{
	DisplayLedTPDF fun;
	fun = ChoiceDisplay (FUNCNAME);
	fun.DisplayLed();
}

通过宏定义(或其他方式)来选择加工哪种产品。这样一个简单的工厂模式就设计结束了。大神们看看,如果有问题欢迎留言指正。

你可能感兴趣的:(嵌入式,架构,C语言)