(本文章旨在个人回顾知识点)
1、详情:
抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
角色:
抽象工厂角色:这是抽象工厂模式的核心,它与应用程序无关。是具体工厂角色必须实现或继承的的父类。
具体工厂角色:包含具体业务逻辑有关的代码。由应用程序调用来创建对应的具体产品对象。它由具体的类来实现。
抽象产品角色:具体产品实现或继承的父类。
具体产品角色:具体工厂角色所创建的对象为此角色的实例。
优点:①便于交换产品系列;②让具体的创建实例过程与客户端分离。
缺点:新增产品族比较复杂,需要改变抽象工厂类,添加增产品类的对应具体工厂类,抽象产品类,具体产品类。
目的:客户端提供一个统一接口,可以创建多个复杂产品族中的产品对象。
2、UML类图:
3、代码实现:
Mouse.h(抽象产品类1)
#pragma once
class Mouse
{
public:
Mouse();
~Mouse();
public:
virtual void showProperty1() = 0;
};
Mouse.cpp
#include "stdafx.h"
#include "Mouse.h"
Mouse::Mouse()
{
}
Mouse::~Mouse()
{
}
DellMouse.h(具体产品1)
#pragma once
#include "Mouse.h"
class DellMouse :
public Mouse
{
public:
DellMouse();
~DellMouse();
public:
void showProperty1();
};
DellMouse.cpp
#include "stdafx.h"
#include "DellMouse.h"
DellMouse::DellMouse()
{
}
DellMouse::~DellMouse()
{
}
void DellMouse::showProperty1()
{
cout << "This is the Dell Mouse" << endl;
}
HPMouse.h(具体产品2)
#pragma once
#include "Mouse.h"
class HPMouse :
public Mouse
{
public:
HPMouse();
~HPMouse();
public:
void showProperty1();
};
HPMouse.cpp
#include "stdafx.h"
#include "HPMouse.h"
HPMouse::HPMouse()
{
}
HPMouse::~HPMouse()
{
}
void HPMouse::showProperty1()
{
cout << "This is HP Mouse!" << endl;
}
Keyboard.h(抽象产品2)
#pragma once
class Keyboard
{
public:
Keyboard();
~Keyboard();
public:
virtual void showProperty2()=0;
};
Keyboard.cpp
#include "stdafx.h"
#include "Keyboard.h"
Keyboard::Keyboard()
{
}
Keyboard::~Keyboard()
{
}
DellKeyboard.h(具体产品1)
#pragma once
#include "Keyboard.h"
class DellKeyboard :
public Keyboard
{
public:
DellKeyboard();
~DellKeyboard();
public:
void showProperty2();
};
DellKeyboard.cpp
#include "stdafx.h"
#include "DellKeyboard.h"
DellKeyboard::DellKeyboard()
{
}
DellKeyboard::~DellKeyboard()
{
}
void DellKeyboard::showProperty2()
{
cout << "This is Dell Keyboard!" << endl;
}
HPKeyboard.h(具体产品2)
#pragma once
#include "Keyboard.h"
class HPKeyboard :
public Keyboard
{
public:
HPKeyboard();
~HPKeyboard();
public:
void showProperty2();
};
HPKeyboard.cpp
#include "stdafx.h"
#include "HPKeyboard.h"
HPKeyboard::HPKeyboard()
{
}
HPKeyboard::~HPKeyboard()
{
}
void HPKeyboard::showProperty2()
{
cout << "This is HP Keyboard!" << endl;
}
AbstractFactory.h(抽象工厂类)
#pragma once
#include "Mouse.h"
#include "Keyboard.h"
class AbstractFactory
{
public:
AbstractFactory();
~AbstractFactory();
public:
virtual Mouse* getMouse(ProductType eProductType) = 0;
virtual Keyboard* getKeyboard(ProductType eProductType) = 0;
};
AbstractFactory.cpp
#include "stdafx.h"
#include "AbstractFactory.h"
AbstractFactory::AbstractFactory()
{
}
AbstractFactory::~AbstractFactory()
{
}
MouseFactory.h(具体工厂类1)
#pragma once
#include "AbstractFactory.h"
class MouseFactory :
public AbstractFactory
{
public:
MouseFactory();
~MouseFactory();
public:
Mouse* getMouse(ProductType eProductType);
Keyboard* getKeyboard(ProductType eProductType);
};
MouseFactory.cpp
#include "stdafx.h"
#include "MouseFactory.h"
#include "DellMouse.h"
#include "HPMouse.h"
MouseFactory::MouseFactory()
{
}
MouseFactory::~MouseFactory()
{
}
Mouse* MouseFactory::getMouse(ProductType eProductType)
{
switch (eProductType)
{
case PT_DELL:
return new DellMouse();
break;
case PT_HP:
return new HPMouse();
break;
default:
return NULL;
break;
}
}
Keyboard* MouseFactory::getKeyboard(ProductType eProductType)
{
return NULL;
}
KeyboardFactory.h(具体工厂类2)
#pragma once
#include "AbstractFactory.h"
class KeyboardFactory :
public AbstractFactory
{
public:
KeyboardFactory();
~KeyboardFactory();
public:
Mouse* getMouse(ProductType eProductType);
Keyboard* getKeyboard(ProductType eProductType);
};
KeyboardFactory.cpp
#include "stdafx.h"
#include "KeyboardFactory.h"
#include "DellKeyboard.h"
#include "HPKeyboard.h"
KeyboardFactory::KeyboardFactory()
{
}
KeyboardFactory::~KeyboardFactory()
{
}
Mouse* KeyboardFactory::getMouse(ProductType eProductType)
{
return NULL;
}
Keyboard* KeyboardFactory::getKeyboard(ProductType eProductType)
{
switch (eProductType)
{
case PT_DELL:
return new DellKeyboard();
break;
case PT_HP:
return new HPKeyboard();
break;
default:
break;
return NULL;
}
}
stdafx.h(预编译头)
// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 特定于项目的包含文件
//
#pragma once
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
#include <iostream>
using namespace std;
enum ProductType{ PT_DELL, PT_HP };
// TODO: 在此处引用程序需要的其他头文件
调用代码:
// FactoryMethodMemo.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "MyAlgorithm.h"
#include "AddFactory.h"
#include "SubFactory.h"
#include "MulFactory.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
MyAlgorithm* pAlgorithmm = NULL;
Factory* pFactory = new AddFactory();
pAlgorithmm = pFactory->GetAlgorithm();
cout << "add:" << pAlgorithmm->GetResult(3.0, 5.0) << endl;
delete pAlgorithmm;
pAlgorithmm = NULL;
delete pFactory;
pFactory = NULL;
pFactory = new SubFactory();
pAlgorithmm = pFactory->GetAlgorithm();
cout << "sub:" << pAlgorithmm->GetResult(3.0, 5.0) << endl;
delete pAlgorithmm;
pAlgorithmm = NULL;
delete pFactory;
pFactory = NULL;
pFactory = new MulFactory();
pAlgorithmm = pFactory->GetAlgorithm();
cout << "mul:" << pAlgorithmm->GetResult(3.0, 5.0) << endl;
delete pAlgorithmm;
pAlgorithmm = NULL;
system("pause");
return 0;
}
输出结果: