首页 > 编程语言 >C++ 设计模式之抽象工厂模式

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

时间:2023-07-07 15:11:55浏览次数:55  
标签:鼠标 创建 C++ 工厂 键盘 抽象 模式 设计模式

设计模式之抽象工厂模式

抽象工厂模式,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。其UML图如下:

 

  结合上图我们来理解一下抽象工厂模式的定义。提供一个创建一些列相关或相互依赖对象的接口,而无需指定它们具体的类。在上图中一系列相互依赖或相关的对象可以理解为ProductA,ProductB,也可以有ProductC、ProductD等,这些是一系列类,要创建这一系列对象。而这一系列对象有不同的类型,比如Product1,和Product2,同样的可以是Product3等。在抽象工厂模式中创建这一系列对象是由相关的工厂负责的。比如    ConcreteFactory1负责创建ProductA1、ProductB1、ProductC1等,同样的ConcreteFactory2负责创建ProductA2、ProductB2、ProductC2等。这就是定义中说的创建一系列对象的接口,而这借口就是工厂。至于无需指定它们具体的类就很明显了,因为创建相关系列的对象的时候只需用指定相关的工厂就可以了,客户端根本不需要知道具体要创建的类是什么。

  举个例子吧,就拿键盘和鼠标来说吧,键盘和鼠标就是一些列的类。而键盘鼠标又有微软的和联想的区别。所有有了微软的工厂和联想的工厂。键盘和鼠标具体的创建由工厂来负责,而具体创建微软的还是联想的则由客户端来指定,而客户端根本不用知道鼠标和键盘这些类。此例的示例代码如下:

 1 // AbstractFactoryModel.h文件
 2 #pragma once
 3 #include <iostream>
 4 
 5 // 键盘
 6 class KeyBoard
 7 {
 8 public:
 9     virtual void show() = 0;
10 };
11 // 微软的键盘
12 class KeyBoardMicro : public KeyBoard
13 {
14 public:
15     void show()
16     {
17         std::cout << "微软的键盘" << std::endl;
18     }
19 };
20 // 联想的键盘
21 class KeyBoardLenovo : public KeyBoard
22 {
23 public:
24     void show()
25     {
26         std::cout << "联想的键盘" << std::endl;
27     }
28 };
29 // 鼠标
30 class Mouse
31 {
32 public:
33     virtual void show() = 0;
34 };
35 
36 class MouseMicro : public Mouse
37 {
38 public:
39     void show()
40     {
41         std::cout << "微软的鼠标" << std::endl;
42     }
43 };
44 
45 class MouseLenovo : public Mouse
46 {
47 public:
48     void show()
49     {
50         std::cout << "联想的鼠标" << std::endl;
51     }
52 };
53 // 工厂
54 class Factory
55 {
56 public:
57     virtual KeyBoard * createKeyBoard() = 0;
58     virtual Mouse * createMouse() = 0;
59 };
60 // 微软的工厂
61 class FactoryMicro : public Factory
62 {
63 public:
64     KeyBoard * createKeyBoard()
65     {
66         return new KeyBoardMicro();
67     }
68     Mouse * createMouse()
69     {
70         return new MouseMicro();
71     }
72 };
73 // 联想的工厂
74 class FactoryLenovo : public Factory
75 {
76 public:
77     KeyBoard * createKeyBoard()
78     {
79         return new KeyBoardLenovo();
80     }
81     Mouse * createMouse()
82     {
83         return new MouseLenovo();
84     }
85 };

测试代码如下:

 1 #include <iostream>
 2 #include "AbstractFactoryModel.h"
 3 
 4 int main()
 5 {
 6     using namespace std;
 7     // 抽象工厂模式
 8     Factory * p = new FactoryMicro();
 9     KeyBoard * pKeyBoard = p->createKeyBoard();
10     Mouse * pMouse = p->createMouse();
11     pKeyBoard->show();
12     pMouse->show();
13     delete pMouse;
14     delete pKeyBoard;
15     delete p;
16 
17     p = new FactoryLenovo();
18     pKeyBoard = p->createKeyBoard();
19     pMouse = p->createMouse();
20     pKeyBoard->show();
21     pMouse->show();
22     delete pMouse;
23     delete pKeyBoard;
24     delete p;
25 
26     getchar();
27     return 0;
28 }

测试结果如下图:

  抽象工厂模式和工厂方法模式很相似。最大的区别就是抽象工厂模式不止一个产品簇,并且每个工厂都不止生产一种产品。比如在工厂方法模式中,不同的工厂可以生产不同的产品。比如键盘、鼠标。分别由键盘工厂和鼠标工厂,但是智能生产一种键盘和鼠标。但是在抽象工厂模式中,每个工厂可以生产键盘和鼠标。还可以生产不同牌子的键盘和鼠标。说到这里,其实抽象工厂模式可以和简单工厂模式结合起来,来创建不同的工厂。

  抽象工厂模式最大的好处便是易于交换产品系列,只要改变创建的工厂对象就可以实现产品系列的更换。还有一个优点是它让具体的创建实例的过程于客户端分离,客户端是通过它们抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。最大的缺点是如果像添加产品则非常麻烦需要修改很多类。

标签:鼠标,创建,C++,工厂,键盘,抽象,模式,设计模式
From: https://www.cnblogs.com/ybqjymy/p/17535020.html

相关文章

  • C++ 设计模式之模板方法模式
    设计模式之模板方法模式模板方法模式,定义一个操作中的算法的股价,而将一些步骤延迟到了子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。说白了就是有一个算法有很多部分,这个算法在基类中已经定义好了。而算法中的各个部分都写成各个成员函......
  • JAVA设计模式之模板模式
    设计模式设计模式(DesignPattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。总体来说设计模式分为三大类:创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、......
  • C++ 设计模式之备忘录模式
    设计模式之备忘录模式备忘录,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。该模式很好理解,其UML图如下:在Originator中提供了创建Memento的接口,具体要保存什么样的内容,则根据需求来定。而Caretake......
  • C++ 设计模式之责任链模式
    设计模式之责任链模式责任链模式,使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象练成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。该模式很好理解,其UML图如下: 每个ConcreteHandler都有一定的请求处理能力,当自己处理不了的时......
  • C++ 设计模式之中介者模式
    设计模式之中介者模式中介者模式,用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地互相引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。该模式很好理解,其UML图如下: Mediator中每个交互者的引用,在Mediator内部封装了各种类之间的交互。至于那个类......
  • C++ 设计模式之享元模式
    设计模式之享元模式享元模式,运用共享技术有效地支持大量细粒度的对象。面向对象技术可以很好地解决一些灵活性或扩展性问题,但在很多情况下需要在系统中增加类和对象的个数。当对象数量太多时,将导致运行代价过高,带来性能下降等问题。享元模式正式为了解决这依赖问题而诞生的。......
  • C++ 设计模式之解释器模式
    设计模式之解释器模式解释器模式,给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。解释器模式解决的问题是,如果一种特定类型的问题发生的频率足够高,那么可能就只得将该问题的各个示例表述为一个简单语言中的句子。这样就可以构建......
  • C/C++数据结构与算法课程设计[2023-07-06]
    C/C++数据结构与算法课程设计[2023-07-06]数据结构与算法课程设计一、课程设计的目的、要求和任务 本课程设计是为了配合《数据结构与算法》课程的开设,通过设计完整的程序,使学生掌握数据结构的应用、算法的编写等基本方法。1.课程的目的(1)使学生进一步理解和掌握课堂上所学......
  • C++ 设计模式之简单工厂模式
    设计模式之简单工厂模式(C++)简单工厂模式,主要用于创建对象。新添加类时,不会影响以前的系统代码。核心思想是用一个工厂来根据输入的条件产生不同的类,然后根据不同类的virtual函数得到不同的结果。优点:适用于不同情况创建不同的类时。缺点:客户端必须要知道基类和工厂类,耦合性差......
  • C++ 设计模式之组合模式
    设计模式之组合模式组合模式,将对象组合成属性结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。其UML图如下:一个组织有很多子组织,而无论子组织是单独一个部门或是一个分组织。该组织都希望把它们当成一样的子组织来管理。......