C++抽象工厂模式+代码实现

版权声明:本文为博主原创文章,转载请注明原文地址:http://blog.csdn.net/helloworld_ptt https://blog.csdn.net/helloworld_ptt/article/details/80166744

抽象工厂模式(Abstract Factory )

抽象工厂模式为创建一组对象提供了一种解决方案。与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一族产品。


如下图中的ConcreteFactory1是一系列产品,ConcreteFactory2则是另一系列产品
他们分别负责生产A1,B1和A2,B2
抽象工厂模式结构图

图片引用自
图片作者:中南大学应用技术博士刘伟

抽象工厂模式实现:

Dell.h

#pragma once                                                                                                                                                  
class Dell
{
public:
    virtual void CPU() = 0;
    virtual void Graphics() = 0;
    virtual void Memory() = 0;
};

HP.h

#pragma once
class HP
{
public:
    virtual void CPU() = 0;
    virtual void Graphics() = 0;
    virtual void Memory() = 0;                                                                                                                                
};

NightElf.h

#pragma once
#include "HP.h"
class NightElf : public HP
{
public:
    void CPU(){
        std::cout<<"Intel i7-7700HQ"<<" ";
    }   
    void Graphics()
    {   
        std::cout<<"技嘉 GTX1060 6G"<<" ";
    }                                                                                                                                                         
    void Memory()
    {   
        std::cout<<"海盗船 复仇者 8G*2"<<std::endl;
    }   
};

ShadowElf.h

#pragma once
#include "HP.h"
class ShadowElf : public HP  
{
    public:
    void CPU(){
        std::cout<<"Intel i5-7300HQ"<<" ";
    }   
    void Graphics()
    {   
        std::cout<<"技嘉 GTX1070 3G"<<" ";
    }   
    void Memory()
    {   
        std::cout<<"Samsung 8G*2"<<std::endl;
    }   
};

Ranger.h

#pragma once                                                                                                                                                  
#include "Dell.h"
class Ranger : public Dell
{
    public:
        void CPU(){
            std::cout<<"Intel i7-8700HQ"<<" ";
        }   
        void Graphics()
        {   
            std::cout<<"技嘉 GTX1050 6G"<<" ";
        }   
        void Memory()
        {   
            std::cout<<"KingSton DDR4 8G*2"<<std::endl;
        }   
};

Laptop.h

#pragma once
#include "Dell.h"
#include "HP.h"
class Laptop
{
public:
    virtual Dell* BuildDell() = 0;
    virtual HP* BuildHP() = 0;                                                                                                                                
};

第一系列产品的工厂

LaptopFactory.h

#pragma once
#include "Laptop.h"
#include "Ranger.h"
#include "NightElf.h"
#include "ShadowElf.h"
class LaptopFactory : public Laptop
{

    public:
        Dell* BuildDell()
        {   
            std::cout<<"DELL游匣"<<" ";
            Dell* pLaptop = new Ranger();
            return pLaptop;
        }   
        HP* BuildHP(string str)
        {   
            HP* pLaptop = nullptr;
            if(str == "NightElf")
            {   
                std::cout<<"HP暗夜精灵"<<" ";
                pLaptop = new NightElf();
            }   
            else
            {   
                std::cout<<"HP暗影精灵"<<" ";//此处其实可以用一个新工厂来生产该产品,例如:写一个
                //Second_Laptop_factory来实现Laptop,完成暗影精灵的生产.这就是抽象工厂的精髓
                pLaptop = new ShadowElf(); 
            }   
            return pLaptop;
        }   
};

test.cpp

#include <iostream>
#include "LaptopFactory.h"

using namespace std;

int main()
{
    Laptop* laptop= new LaptopFactory();

    Dell* pDell_Laptop = laptop->BuildDell();                                                                                                                 
    pDell_Laptop->CPU();
    pDell_Laptop->Graphics();
    pDell_Laptop->Memory();

    HP* pHP_Laptop = laptop->BuildHP("NightElf");
    pHP_Laptop->CPU();
    pHP_Laptop->Graphics();
    pHP_Laptop->Memory();

    pHP_Laptop = laptop->BuildHP("ShadowElf");
    pHP_Laptop->CPU();
    pHP_Laptop->Graphics();
    pHP_Laptop->Memory();

    return 0;
}

运行测试结果:
这里写图片描述

精髓在这里:

这是第二个工厂:负责生产第二系列产品

Second_Laptop_Factory.h

#pragma once
#include "Laptop.h"
#include "ShadowElf.h"
class Second_Laptop_Factory : public Laptop
{
    public:
        Dell* BuildDell()/*balabalabala*/
        {
            return NULL;
        }
        HP* BuildHP(/*string str*/)
        {
            HP* pLaptop = new ShadowElf();
            return pLaptop;
        }
};

以上代码纯手打,如若有误请谅解

猜你喜欢

转载自blog.csdn.net/helloworld_ptt/article/details/80166744