设计模式之---(抽象)工厂模式
用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模式主要在于应对“新系列”的需求变动。其缺点在于难以应对“新对象”的需求变动