前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式之抽象工厂模式(AbstactFactory )

设计模式之抽象工厂模式(AbstactFactory )

作者头像
海盗船长
发布2021-12-07 16:05:30
3180
发布2021-12-07 16:05:30
举报
文章被收录于专栏:基础知识文章基础知识文章

概念

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

介绍

意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

主要解决:主要解决接口选择的问题。

何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。

如何解决:在一个产品族里面,定义多个产品。

关键代码:在一个工厂里聚合多个同类产品。

优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

注意事项:产品族难扩展,产品等级易扩展。

模式结构

在这里插入图片描述
在这里插入图片描述

AbstractFactory 模式关键就是将这一组对象的创建封装到一个用于创建对象的类(ConcreteFactory)中, 维护这样一个创建类总比维护 n 多相关对象的创建过程要简单的多。

代码实现

“Product.h”
代码语言:javascript
复制
#ifndef _PRODUCT_H
#define _PRODUCT_H
class AbstractProductA{
public:
	virtual ~AbstractProductA();
protected:
	AbstractProductA();
};
class AbstractProductB{
public:
	virtual ~AbstractProductB();
protected:
	AbstractProductB();
};
class ProductA1:public AbstractProductA{
public:
	ProductA1();
	~ProductA1();
};
class ProductA2 :public AbstractProductA{
public:
	ProductA2();
	~ProductA2();
};
class ProductB1 :public AbstractProductB{
public:
	ProductB1();
	~ProductB1();
};
class ProductB2 :public AbstractProductB{
public:
	ProductB2();
	~ProductB2();
};
#endif
“Product.cpp”
代码语言:javascript
复制
#include<iostream>
#include"Product.h"
using namespace std;
AbstractProductA::AbstractProductA(){}
AbstractProductA::~AbstractProductA(){}
AbstractProductB::AbstractProductB(){}
AbstractProductB::~AbstractProductB(){}

ProductA1::ProductA1(){
	cout << "ProductA1" << endl;
}
ProductA1::~ProductA1(){}

ProductA2::ProductA2(){
	cout << "ProductA2" << endl;
}
ProductA2::~ProductA2(){}

ProductB1::ProductB1(){
	cout << "ProductB1" << endl;
}
ProductB1::~ProductB1(){}

ProductB2::ProductB2(){
	cout << "ProductB2" << endl;
}
ProductB2::~ProductB2(){}
“AbstractFactory.h”
代码语言:javascript
复制
#ifndef _ABSTRACTFACTORY_H
#define _ABSTRACTFACTORY_H
class AbstractProductA;
class AbstractProductB;
class AbstractFactory{
public:
	~AbstractFactory();
	virtual AbstractProductA* CreateProductA() = 0;
	virtual AbstractProductB* CreateProductB() = 0;
protected:
	AbstractFactory();
};

class ConcreteFactory1 :public AbstractFactory{
public:
	ConcreteFactory1();
	~ConcreteFactory1();
	AbstractProductA* CreateProductA();
	AbstractProductB* CreateProductB();
};
class ConcreteFactory2 :public AbstractFactory{
public:
	ConcreteFactory2();
	~ConcreteFactory2();
	AbstractProductA* CreateProductA();
	AbstractProductB* CreateProductB();
};
#endif
“AbstractFactory.cpp”
代码语言:javascript
复制
#include<iostream>
#include"Product.h"
#include"AbstractFactory.h"
using namespace std;

AbstractFactory::AbstractFactory(){}
AbstractFactory::~AbstractFactory(){}
ConcreteFactory1::ConcreteFactory1(){}
ConcreteFactory1::~ConcreteFactory1(){}
AbstractProductA* ConcreteFactory1::CreateProductA(){
	return new ProductA1();
}
AbstractProductB* ConcreteFactory1::CreateProductB(){
	return new ProductB1();
}

ConcreteFactory2::ConcreteFactory2(){}
ConcreteFactory2::~ConcreteFactory2(){}
AbstractProductA* ConcreteFactory2::CreateProductA(){
	return new ProductA2();
}
AbstractProductB* ConcreteFactory2::CreateProductB(){
	return new ProductB2();
}
“test.cpp”
代码语言:javascript
复制
#include<iostream>
#include"Product.h"
#include"AbstractFactory.h"

using namespace std;
int main(){
	AbstractFactory* cfl = new ConcreteFactory1();
	cfl->CreateProductA();
	cfl->CreateProductB();
	AbstractFactory* cfll = new ConcreteFactory2();
	cfll->CreateProductA();
	cfll->CreateProductB();
	system("pause");
	return 0;
}
在这里插入图片描述
在这里插入图片描述

在测试程序中可以看到, 当我们要创建一组对象(ProductA1, ProductA2)的时候我们只用维护一个创建对象(ConcreteFactory1),大大简化了维护的成本和工作。

总结

AbstractFactory 模式是为创建一组(有多类) 相关或依赖的对象提供创建接口, 而 Factory 模式正如我在相应的文档中分析的是为一类对象提供创建接口或延迟对象的创建到子类中实现。并且可以看到, AbstractFactory 模式通常都是使用 Factory 模式实现(ConcreteFactory1)。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-03-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概念
  • 介绍
  • 模式结构
  • 代码实现
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档