C++设计模式之抽象工厂模式

所属分类: 软件编程 / C 语言 阅读数: 58
收藏 0 赞 0 分享

抽象工厂模式

模式定义

抽象工厂模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。

模式动机

通常是在运行时刻在创建一个ConcreteFactory类的实例,这个具体的工厂再创建具有特定实现的产品对象,也就是说,为创建不同的产品对象,客户端应使用不同的具体工厂。

UML类图

源码实现

abstractproducta.h

#include <string>

class AbstracProductA
{
public:
 AbstracProductA();
 virtual ~AbstracProductA();

 void Show();
 virtual std::string Name();
};

class ConcreteProductA1 : public AbstracProductA
{
public:
 ConcreteProductA1();
 std::string Name() override;
};

class ConcreteProductA2 : public AbstracProductA
{
public:
 ConcreteProductA2();
 std::string Name() override;
};

abstractfactory.h

#include "abstracproducta.h"
#include "abstracproductb.h"

class AbstractFactory
{
public:
 AbstractFactory();
 virtual ~AbstractFactory();

 virtual AbstracProductA* CreateProductA() = 0;
 virtual AbstracProductB* CreateProductB() = 0;
};

class ConcreteFactory1 : public AbstractFactory
{
public:
 ConcreteFactory1();

 AbstracProductA* CreateProductA() override;
 AbstracProductB* CreateProductB() override;
};

class ConcreteFactory2 : public AbstractFactory
{
public:
 ConcreteFactory2();

 AbstracProductA* CreateProductA() override;
 AbstracProductB* CreateProductB() override;
};

main.cpp

#include <iostream>
#include "abstractfactory.h"
#include "abstracproducta.h"
#include "abstracproductb.h"

using namespace std;

int main()
{
 AbstractFactory* factory1 = new ConcreteFactory1();
 AbstracProductA* pA1 = factory1->CreateProductA();
 AbstracProductB* pB1 =factory1->CreateProductB();

 pA1->Show();
 pB1->Show();

 AbstractFactory* factory2 = new ConcreteFactory2();
 AbstracProductA* pA2 = factory2->CreateProductA();
 AbstracProductB* pB2 =factory2->CreateProductB();

 pA2->Show();
 pB2->Show();

 return 0;
}

运行结果

优点

抽象工厂模式的优点

  • 好处是易于交换产品系列,由于具体工厂类,在一个应用中只需要在初始化的时候出现一次,这就使得该百年一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置。
  • 它让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。

缺点

模式的缺点

  • 所有在用简单工厂的地方,都可以考虑用反射技术来去除switch或if,接触分支判断带来的耦合。

感悟

一个程序员如果从来没有熬夜写程序的经历,不能算是一个好程序猿,因为他没有痴迷过,所以他不会有大成就。

更多精彩内容其他人还在看

C语言数组入门之数组的声明与二维数组的模拟

这篇文章主要介绍了C语言数组入门之数组的声明与二维数组的模拟,数组学习的同时也要相应理解C语言指针的作用,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言中变量与其内存地址对应的入门知识简单讲解

这篇文章主要介绍了C语言中变量与其内存地址对应的入门知识简单讲解,同时这也是掌握指针部分知识的基础,需要的朋友可以参考下
收藏 0 赞 0 分享

讲解C语言编程中指针赋值的入门实例

这篇文章主要介绍了讲解C语言编程中指针赋值的入门实例,通过const int i与int *const pi这样两个例子来分析指针的赋值和地址指向,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言中的结构体的入门学习教程

这篇文章主要介绍了C语言中的结构体的入门学习教程,以struct语句定义的结构体是C语言编程中的重要基础,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言编程入门之程序头文件的简要解析

这篇文章主要介绍了C语言编程入门之程序头文件的简要解析,包括头文件重复包含问题等方面的说明,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言编程中的联合体union入门学习教程

这篇文章主要介绍了C语言编程中的联合体union入门学习教程,也是C语言入门学习中的基础知识,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言中数组作为函数的参数以及返回值的使用简单入门

这篇文章主要介绍了C语言中数组作为函数的参数以及返回值的使用简单入门,这里以一维数组作为基本条件进行例子讲解,需要的朋友可以参考下
收藏 0 赞 0 分享

MySQL的内存表的基础学习教程

这篇文章主要介绍了MySQL的内存表的基础学习教程,包括内存表的创建以及使用限制等等,需要的朋友可以参考下
收藏 0 赞 0 分享

C++中头文件的概念与基本编写方法

这篇文章主要介绍了C++中头文件的概念与基本编写方法,是C++入门学习中的基础知识,需要的朋友可以参考下
收藏 0 赞 0 分享

jQuery移动页面开发中主题按钮的设计示例

这篇文章主要介绍了jQuery移动页面开发中主题按钮的设计示例,jQuery是当今最具人气的JavaScript开发类库,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多