版权声明:本文为博主原创文章,转载请注明原文地址: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;
}
};
以上代码纯手打,如若有误请谅解