用C++实现(抽象工厂实例)

用C++实现(抽象工厂实例)


前言

一、什么是抽象工厂模式?

提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定它们具体的类。
——《设计模式》GoF

二、为什么需要抽象工厂模式

在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时,由于需求的变化,往往存在更多系列对象的创建工作。

如何应对这种变化?如何绕过常规的对象创建方法,提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?

三、C++代码示意图

在这里插入图片描述

1.调用者—sys_init函数

该函数调用了抽象工厂class_hareware去创建具体工厂class_xxx_factory,对应工厂再创建具体产品,再调用产品中的方法。

代码如下(示例):

#include"class_hardware.h"

/*这里是仿照某个接口里使用了class_hardware抽象工厂里面的接口*/
class class_sys_init {
public:
	int sys_init(void);
};


int class_sys_init::sys_init()
{
	/*抽象工厂创建*/
	class_hardware * hardware = new class_hardware();
	if (hardware == NULL)
		return -1;

	/*由抽象工厂构造函数创建的具体工厂(lcd工厂)*/
	class_lcd_factory * lcd_factory = hardware->lcd_fac;
	if (lcd_factory == NULL)
		return -1;

	/*由具体工厂(lcd工厂)创建具体产品*/
	class_lcd * lcd = lcd_factory->lcd_create(NULL);
	if (lcd == NULL)
		return -1;

	/*调用lcd的初始化接口*/
	lcd->lcd_init();
	lcd->lcd_read_byte();
	lcd->lcd_write_byte(0);

	delete lcd;
	delete  hardware;
	return 0;
}

2.抽象工厂class_hardware代码

代码如下(示例):

static class_lcd_factory * lcd_factory_handler(unsigned int lcd_type)
{
	switch (lcd_type)
	{
	case TYPE_LCD_A:
		return new class_lcd_a_factory();

#if 0 /*如果有多种lcd类型的话*/
	case TYPE_LCD_B:
		return new class_lcd_b_factory();
#endif

	default:
		return NULL;
	}

}


/*hardware抽象工厂,将创建一系列硬件相关具体工厂*/
class class_hardware {
public:
	class_lcd_factory * lcd_fac;//lcd具体工厂
	/*这里下面可以仿照lcd具体工厂,添加如speaker等硬件具体工厂,这里就不再重复赘述*/
	/*eg:class_speaker_factory * speaker_fac;//speaker具体工厂 */

	class_hardware(){
		/*这里是模拟判断某个参数然后去选择lcd类型,可以改为从外部入参*/
		this->lcd_fac = lcd_factory_handler(TYPE_LCD_A);/*假设同感某接口获取到现在是TYPE_LCD_A*/
		std::cout << "class_hardware" << std::endl;
	}

	~class_hardware() {
		std::cout << "~class_hardware" << std::endl;
		delete this->lcd_fac;
	}
    
};

2.lcd具体工厂代码

代码如下(示例):

/*lcd工厂基类*/
enum
{
	TYPE_LCD_A = 1,
	TYPE_LCD_MAX
};

/*lcd工厂的基类*/
class class_lcd_factory {
public:
	virtual class_lcd * lcd_create(void * para) = 0;
};


/*lcd_a的具体工厂,继承lcd工厂基类*/
class class_lcd_a : public class_lcd {
public:
	void lcd_write_byte(char data) {
		std::cout << "lcda write" << std::endl;
	}

	char lcd_read_byte(void) {
		std::cout << "lcda read" << std::endl;
		return 0;
	}

	char lcd_init(void) {
		std::cout << "lcda init" << std::endl;
		return 0;
	}
};

class class_lcd_a_factory : public  class_lcd_factory {
	class_lcd * lcd_create(void * para) {
		class_lcd * result = new class_lcd_a();
		return result;
	}
};

运行结果

在这里插入图片描述

##要点总结
如果没有应对“多系列对象构建”的需求变化,则没有必要使用Abstract Factory模式,这时候使用简单的工厂完全可以。
“系列对象”指的是在某一特定系列下的对象之间有相互依赖、或作用的关系。不同系列的对象之间不能相互依赖。
Abstract Factory模式主要在于应对“新系列”的需求变动。其缺点在于难以应对“新对象”的需求变动

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值