美文网首页
抽象工厂模式

抽象工厂模式

作者: Coding破耳 | 来源:发表于2020-05-08 23:28 被阅读0次

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

    // AbstractFactoryModel.h文件
    #pragma once
    #include <iostream>
    
    // 键盘
    class KeyBoard
    {
    public:
        virtual void show() = 0;
    };
    // 微软的键盘
    class KeyBoardMicro : public KeyBoard
    {
    public:
        void show()
        {
            std::cout << "微软的键盘" << std::endl;
        }
    };
    // 联想的键盘
    class KeyBoardLenovo : public KeyBoard
    {
    public:
        void show()
        {
            std::cout << "联想的键盘" << std::endl;
        }
    };
    // 鼠标
    class Mouse
    {
    public:
        virtual void show() = 0;
    };
    
    class MouseMicro : public Mouse
    {
    public:
        void show()
        {
            std::cout << "微软的鼠标" << std::endl;
        }
    };
    
    class MouseLenovo : public Mouse
    {
    public:
        void show()
        {
            std::cout << "联想的鼠标" << std::endl;
        }
    };
    // 工厂
    class Factory
    {
    public:
        virtual KeyBoard * createKeyBoard() = 0;
        virtual Mouse * createMouse() = 0;
    };
    // 微软的工厂
    class FactoryMicro : public Factory
    {
    public:
        KeyBoard * createKeyBoard()
        {
            return new KeyBoardMicro();
        }
        Mouse * createMouse()
        {
            return new MouseMicro();
        }
    };
    // 联想的工厂
    class FactoryLenovo : public Factory
    {
    public:
        KeyBoard * createKeyBoard()
        {
            return new KeyBoardLenovo();
        }
        Mouse * createMouse()
        {
            return new MouseLenovo();
        }
    };
    

    测试代码如下:

    #include <iostream>
    #include "AbstractFactoryModel.h"
    
    int main()
    {
        using namespace std;
        // 抽象工厂模式
        Factory * p = new FactoryMicro();
        KeyBoard * pKeyBoard = p->createKeyBoard();
        Mouse * pMouse = p->createMouse();
        pKeyBoard->show();
        pMouse->show();
        delete pMouse;
        delete pKeyBoard;
        delete p;
    
        p = new FactoryLenovo();
        pKeyBoard = p->createKeyBoard();
        pMouse = p->createMouse();
        pKeyBoard->show();
        pMouse->show();
        delete pMouse;
        delete pKeyBoard;
        delete p;
    
        getchar();
        return 0;
    }
    

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

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

    参考:https://blog.csdn.net/konglongdanfo1/java/article/details/83380770

    相关文章

      网友评论

          本文标题:抽象工厂模式

          本文链接:https://www.haomeiwen.com/subject/wudcnhtx.html