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

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

  • 1. 抽象工厂(AbstractFactory)模式介绍
  • 2. 为方便理解,举个例子
  • 3. 抽象工厂(AbstractFactory)模式优缺点
  • 4. 工厂方法模式和抽象工厂模式的应用场景

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

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

使用条件

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

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

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

类图

C++设计模式7——抽象工厂(AbstractFactory)模式_第1张图片

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

各个国家工厂创建各个国家的水果
C++设计模式7——抽象工厂(AbstractFactory)模式_第2张图片

#include
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. 抽象的工厂模式——目的是在一定的条件下,减少工厂的个数

你可能感兴趣的:(设计模式,设计模式,抽象工厂)