C++设计模式7——抽象工厂(AbstractFactory)模式

1. 抽象工厂(AbstractFactory)模式介绍

定义:提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定它们具体的类。

使用条件

  1. 系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。
  2. 系统一次只可能消费其中某一族产品,即同族的产品一起使用。

模式的结构
抽象工厂模式的主要角色如下。

  1. 抽象工厂(Abstract Factory)
    :提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同等级的产品。
  2. 具体工厂(Concrete Factory)
    :主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
  3. 抽象产品(Product)
    :定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
  4. 具体产品(ConcreteProduct)
    :实现了抽象产品角色所定义的接口,由具体工厂来创建,它 同具体工厂之间是多对一的关系。

类图

在这里插入图片描述

2. 为方便理解,举个例子

各个国家工厂创建各个国家的水果
在这里插入图片描述

#include<iostream>
using namespace std;
 
class Fruit{
public:
	virtual void getName()=0;
};
 
//下面两个类是一个产品族
class ChinaApple:public Fruit{
public:
	virtual void getName(){
		cout<<"chinaApple"<<endl;
	}
};
 
class ChinaBanana:public Fruit{
public:
    virtual void getName(){
         cout<<"ChinaBanana"<<endl;
    }
};
 
//下面两个类是一个产品族
class USAApple:public Fruit{
public:
	virtual void getName(){
         cout<<"USAApple"<<endl;
	}
};
 
class USABanana:public Fruit{
public:
    virtual void getName(){
         cout<<"USABanana"<<endl;
	}
};
 
//抽象的工厂(根据产品族进行生产)
class AbstractFactory{
public:
	//苹果的生产器
	virtual Fruit*createApple()=0;
	//香蕉的生产器
	virtual Fruit*createBanana()=0;
};
 
//中国的工厂(虚函数都要实现,哪怕你不用)
class ChinaFactory:public AbstractFactory{
public:
	//苹果的生产器
	virtual Fruit* createApple(){
		return new ChinaApple;
	}
 
	//香蕉的生产器
	virtual Fruit* createBanana(){
		return new ChinaBanana;
	}
};
 
//美国的工厂
class USAFactory:public AbstractFactory{
public:
	//苹果的生产器
    virtual Fruit* createApple(){
        return new USAApple;
    }
 
    //香蕉的生产器
    virtual Fruit* createBanana(){
        return new USABanana;
    }
};
 
 
int main(){
	//中国的系列产品
	//利用一个对象生成统一产品族的商品
	AbstractFactory *chinaFactory= new ChinaFactory;
	Fruit *c_apple=chinaFactory->createApple();
    c_apple->getName();
	Fruit *c_banana=chinaFactory->createBanana();
    c_banana->getName();
 
	//要一个混合的产品,中国的苹果和美国的香蕉
	//跨产品族的,创建的工厂类就和普通工厂类相同
	AbstractFactory *useFactory= new USAFactory;
	Fruit *u_banana=useFactory->createBanana();
    u_banana->getName();
	
	return 0;
}

3. 抽象工厂(AbstractFactory)模式优缺点

主要优点如下:

  1. 可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
  2. 当增加一个新的产品族时不需要修改原代码,满足开闭原则。

缺点是:当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。

4. 工厂方法模式和抽象工厂模式的应用场景

  1. 工厂模式——工厂数量和产品数量一样多——适用于产品数量相对一般的情况
  2. 抽象的工厂模式——目的是在一定的条件下,减少工厂的个数
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值