动机
- 在软件系统中,经常面临一系列相互依赖的对象的创建工作。同时由于需求的变化,往往存在更多系列对象的创建工作
定义
- 提供一个接口,让该接口负责创建一系列相关或者相互依赖的对象,无需指定它们具体的类
要点
- 如果没有应对多系列对象构建的需求变化,则没有必要使用抽象工厂模式,这时候使用简单的工厂完全可以
- 系列对象指的是在某一特定系列下的对象之间有相互依赖、作用的关系。不同系列的对象之间不能相互依赖
- 抽象工厂模式主要在于应对新系列的需求变动。缺点在于难以应对新对象的需求变动
示例
#include <cstdio>
//CBasePrint 与 CBaseDeal 是具有关联关系的类,经常需要一起被创建
class CBasePrint
{
public:
virtual ~CBasePrint() {}
virtual void Print() = 0;
};
class CChild_Print_0 : public CBasePrint
{
public:
virtual void Print() { printf("P 0\n"); }
};
class CChild_Print_1 : public CBasePrint
{
public:
virtual void Print() { printf("P 1\n"); }
};
class CBaseDeal
{
public:
virtual ~CBaseDeal() {}
virtual void Deal() = 0;
};
class CChild_Deal_0 : public CBaseDeal
{
public:
virtual void Deal() { printf("D 0\n"); }
};
class CChild_Deal_1 : public CBaseDeal
{
public:
virtual void Deal() { printf("D 1\n"); }
};
//抽象工厂,负责一系列相关对象的创建工作
class CFactoryBase
{
public:
virtual ~CFactoryBase() {}
virtual CBasePrint* CreatePrint() = 0;
virtual CBaseDeal* CreateDeal() = 0;
};
class CFactory_0
{
public:
virtual CBasePrint* CreatePrint() { return new CChild_Print_0; }
virtual CBaseDeal* CreateDeal() { return new CChild_Deal_0; }
};
class CFactory_1
{
public:
virtual CBasePrint* CreatePrint() { return new CChild_Print_1; }
virtual CBaseDeal* CreateDeal() { return new CChild_Deal_1; }
};
int main()
{
CFactory_0 Factory0;
CFactory_1 Factory1;
Factory0.CreatePrint()->Print(); //P 0
Factory0.CreateDeal()->Deal(); //D 0
Factory1.CreatePrint()->Print(); //P 1
Factory1.CreateDeal()->Deal(); //D 1
return 0;
}
https://www.bilibili.com/video/av24176315/?p=9
网友评论