• 14.抽象工厂模式


    UML

    在这里插入图片描述

    代码

    #include 
    #include 
    using namespace std;
     
    class AbstractProductA
    {
    public:
        virtual void showa() = 0;
    };
    class ProductA1:public AbstractProductA
    {
    public:
        virtual void showa(){
            cout << "我是A1" << endl;
        }
    };
    class ProductA2:public AbstractProductA
    {
    public:
        virtual void showa(){
            cout << "我是A2" << endl;
        }
    };
     
     
    class AbstractProductB
    {
    public:
        virtual void showb() = 0;
    };
    class ProductB1:public AbstractProductB
    {
    public:
        virtual void showb(){
            cout << "我是B1" << endl;
        }
    };
    class ProductB2:public AbstractProductB
    {
    public:
        virtual void showb(){
            cout << "我是B2" << endl;
        }
    };
    class AbstractFactory{
    public:
        virtual AbstractProductA *CreateProductA() = 0;
        virtual AbstractProductB *CreateProductB() = 0;
    };
     
    class ConcreteFactory1:public AbstractFactory
    {
    public:
        virtual AbstractProductA *CreateProductA(){
            return new ProductA1();
        }
        virtual AbstractProductB *CreateProductB(){
            return new ProductB1();
        }
    };
     
    class ConcreteFactory2:public AbstractFactory
    {
    public:
        virtual AbstractProductA *CreateProductA(){
            return new ProductA2();
        }
        virtual AbstractProductB *CreateProductB(){
            return new ProductB2();
        }
    };
     
    int main(void)
    {
        cout << "创建工厂1" << endl;
        AbstractFactory *f1 = new ConcreteFactory1();
        f1->CreateProductA()->showa();
        f1->CreateProductB()->showb();
     
        cout << "创建工厂2" << endl;
        AbstractFactory *f2 = new ConcreteFactory2();
        f2->CreateProductA()->showa();
        f2->CreateProductB()->showb();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84

    结果:

    创建工厂1
    我是A1
    我是B1
    创建工厂2
    我是A2
    我是B2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
    在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

    意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
    主要解决:主要解决接口选择的问题。
    何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
    如何解决:在一个产品族里面,定义多个产品。
    关键代码:在一个工厂里聚合多个同类产品。
    应用实例:工作了,为了参加一些聚会,肯定有两套或多套衣服吧,比如说有商务装(成套,一系列具体产品)、时尚装(成套,一系列具体产品),甚至对于一个家庭来说,可能有商务女装、商务男装、时尚女装、时尚男装,这些也都是成套的,即一系列具体产品。假设一种情况(现实中是不存在的,要不然,没法进入共产主义了,但有利于说明抽象工厂模式),在您的家中,某一个衣柜(具体工厂)只能存放某一种这样的衣服(成套,一系列具体产品),每次拿这种成套的衣服时也自然要从这个衣柜中取出了。用 OOP 的思想去理解,所有的衣柜(具体工厂)都是衣柜类的(抽象工厂)某一个,而每一件成套的衣服又包括具体的上衣(某一具体产品),裤子(某一具体产品),这些具体的上衣其实也都是上衣(抽象产品),具体的裤子也都是裤子(另一个抽象产品)。
    优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
    缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
    使用场景: 1、QQ 换皮肤,一整套一起换。 2、生成不同操作系统的程序。

    参考:https://lkmao.blog.csdn.net/article/details/129016986

  • 相关阅读:
    OpenCV每日函数 计算摄影模块(5) 无缝克隆算法
    箭头函数和普通函数的区别
    HTML期末作业 计算机毕业设计——简单的学生网页作业源码 基于HTML品优购项目的设计与实现(7页)
    零信任身份管理平台,构建下一代网络安全体系
    Git配置用户名和邮箱
    (STM32)从零开始的RT-Thread之旅--GPIO
    MIT 6.S081学习笔记(第三章)
    力扣:138. 随机链表的复制(Python3)
    数据结构与算法之折半查找
    qt+opengl(一)
  • 原文地址:https://blog.csdn.net/qq_40178082/article/details/133038650