设计模式-抽象工厂

本文详细介绍了抽象工厂模式,包括其定义、应用场景及优缺点。通过代码示例展示了如何创建产品族和产品等级,并指出该模式适用于扩展同一产品等级,但扩展产品族时存在困难。在实际应用中,抽象工厂模式能够确保客户端使用同一产品族的对象,但可能增加系统的复杂性和理解成本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设计模式-抽象工厂

产品族:一个品牌下面的所有产品;

产品等级:多个品牌下面的同种产品;

应用场景

抽象工厂后续的拓展是拓展产品等级,如果是拓展产品族则不建议使用抽象工厂模式

类图

在这里插入图片描述

代码

#include <iostream> 
using namespace std; 


class AbstractProductA 
{ 
public: 
    virtual ~AbstractProductA(){}; 
protected: 
    AbstractProductA(){

    }
}; 

class ProductA1:public AbstractProductA 
{ 
public: 
    ProductA1(){
        cout<<"ProductA1"<<endl;
    }
    ~ProductA1(){} 
}; 
class ProductA2:public AbstractProductA 
{ 
public: 
    ProductA2(){
        cout<<"ProductA2"<<endl;
    }
    ~ProductA2(){} 
};

//后续拓展ProductA3
class ProductA3:public AbstractProductA 
{ 
public: 
    ProductA3(){
        cout<<"ProductA3"<<endl;
    }
    ~ProductA3(){} 
}; 
class AbstractProductB 
{ 
public: 
    virtual ~AbstractProductB(){}; 
protected: 
    AbstractProductB(){}
};


class ProductB1:public AbstractProductB 
{ 
public: 
    ProductB1(){
        cout<<"ProductB1"<<endl;
    }
    ~ProductB1(){} 
}; 
class ProductB2:public AbstractProductB 
{ 
public: 
    ProductB2(){
        cout<<"ProductB2"<<endl;
    }
    ~ProductB2(){}; 
};

//后续拓展ProductB3
class ProductB3:public AbstractProductB 
{ 
public: 
    ProductB3(){
        cout<<"ProductB3"<<endl;
    }
    ~ProductB3(){}; 
};
class AbstractFactory 
{ 
public: 
    virtual ~AbstractFactory(){}; 
    virtual AbstractProductA* CreateProductA() = 0;
virtual AbstractProductB* CreateProductB() = 0;
protected: 
    AbstractFactory(){}
private: 
}; 
class ConcreteFactory1:public AbstractFactory
{ 
public: 
    ConcreteFactory1(){}
    ~ConcreteFactory1(){} 
    AbstractProductA* CreateProductA(){
        return new ProductA1;
    }
    AbstractProductB* CreateProductB(){
        return new ProductB1;
    }

};

class ConcreteFactory2:public AbstractFactory
{ 
public: 
 ConcreteFactory2(){}
 ~ConcreteFactory2(){} 
 AbstractProductA* CreateProductA(){
    return new ProductA2;
 }
 AbstractProductB* CreateProductB(){
    return new ProductB2;
}
};
//后续拓展ConcreteFactory3
class ConcreteFactory3:public AbstractFactory
{ 
public: 
 ConcreteFactory3(){}
 ~ConcreteFactory3(){} 
 AbstractProductA* CreateProductA(){
    return new ProductA3;
 }
 AbstractProductB* CreateProductB(){
    return new ProductB3;
}
};
int main(int argc,char* argv[])
{ 
    AbstractFactory* cf1 = new ConcreteFactory1(); 
    cf1->CreateProductA(); 
    cf1->CreateProductB(); 


    AbstractFactory* cf2 = new ConcreteFactory2(); 
    cf2->CreateProductA(); 
    cf2->CreateProductB(); 
    //后续拓展
    AbstractFactory* cf3 = new ConcreteFactory3(); 
    cf3->CreateProductA(); 
    cf3->CreateProductB(); 
    return 0;
}

优点

个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象(将一个系列的产品统一一起创建);

缺点

产品族扩展非常困难,要增加一个系列的某一产品,既要修改工厂抽象类里加代码,又修改具体的实现类里面加代码;
增加了系统的抽象性和理解难度;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长不大的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值