• 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

  • 相关阅读:
    零代码编程:用ChatGPT批量采集bookroo网页上的英文书目列表
    day057:Set集合、TreeSet集合、自然排序Comparable的使用
    从一个 issue 出发,带你玩图数据库 NebulaGraph 内核开发
    Django框架的全面指南:从入门到高级【第128篇—Django框架】
    【前端工程化】js实现diff算法,对比两个字符串
    重建恐龙化石,摄影测量在古生物学中有怎样的意义?
    QT6不支持QDesktopWidget包含头文件报错Qt 获取设备屏幕大小
    linux中单节点安装greenplum数据库
    论文速览 Arxiv 2023 | DMV3D: 单阶段3D生成方法
    【JavaScript总结】双等与三等
  • 原文地址:https://blog.csdn.net/qq_40178082/article/details/133038650