抽象工厂模式

简介
抽象工厂模式:
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

构成
产品基类:这里包含产品基类A和产品基类B,这两个产品都从共同的基类继承而来,但是这个继承关系却是在这个模式之外的部分,而本身这个模式关心的是这两个产品基类的差异部分。
具体产品类:这里的具体产品类是产品A1,A2,B1、B2等,
工厂抽象接口:定义了创建产品的接口,这里返回参数是返回的产品A,产品B,而本身产品A和B的共同基类,正是这个特征构成了抽象工厂和工厂模式的区别。
具体工厂实现类:工厂1和工厂2。新增加系列,只需新实现一个工厂。

常用的场景
1.一个系统要独立于它的产品的创建、组合和表示时。
2.一个系统要由多个产品系列中的一个来配置时。
3.当你要强调一系列相关的产品对象的设计以便进行联合使用时。
4.当你提供一个产品类库,而只想显示它们的接口而不是实现时。

优点
1. 抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就变得相对容易,所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。抽象工厂封装了变化,封装了对象创建的具体细节,对客户端隐藏对象创建的具体细节,符合”封装变化原则”。
2. 当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。
3. 增加新的产品族很方便,无须修改已有系统,符合“开闭原则”。
4. 客户端可以针对抽象进行编程,而不需要知道具体类型,符合”针对接口进行编程而不是针对具体进行编程原则”。

缺点
1. 增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,这显然会带来较大的不便,违背了“开闭原则”。
区别
1.简单工厂模式:一个工厂可以生产多个同级产品。
2.工厂模式:多个工厂生产多个同级产品。
3.抽象工厂模式:多个工厂生产多个同级别的产品族, 这些同级别产品族下面还有多个级别的产品.

测试代码

#include <iostream>
#include <assert.h>
#include <vector>
using namespace std;


//抽象产品类
class FBaseProductA
{

};

class FBaseProductB
{

};

//具体产品类
class FProductA1 : public FBaseProductA
{

};

class FProductA2 : public FBaseProductA
{

};

class FProductB1 : public FBaseProductB
{

};


class FProductB2 : public FBaseProductB
{

};




//抽象工厂类
class FBaseFactory
{
public:
    virtual FBaseProductA* createProductA();
    virtual FBaseProductB* createProductB();
};


//具体工厂类
class FFactoryA : public FBaseFactory
{
public:
    FBaseProductA* createProductA(){return new FProductA1();};
    FBaseProductB* createProductB(){return new FProductB2();};
};

class FFactoryB : public FBaseFactory
{
public:
    FBaseProductA* createProductA(){return new FProductA2();};
    FBaseProductB* createProductB(){return new FProductB1();};
};


void main()
{


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值