目录
基本概念
工厂方法模式(Factory Method):定义一个用于创建对象的接口,让字类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类;
简单工厂模式的最大优点在用户工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了具体产品的依赖。
工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂内部逻辑判断移到了客户端代码来进行。
UML图如下(这里以计算器为例)
代码及实例
程序运行截图如下:
源码如下:
Head.h
#ifndef HEAD_H
#define HEAD_H
//运算相关
class Operation{
public:
double m_numberA;
double m_numberB;
virtual double getResult();
};
class AddOperation: public Operation{
public:
AddOperation();
double getResult();
};
class MultiOperation: public Operation{
public:
MultiOperation();
double getResult();
};
//工厂相关
class IFactory{
public:
virtual Operation *createOperation();
};
class AddFactory: public IFactory{
public:
Operation *createOperation();
};
class MultiFactory: public IFactory{
public:
Operation *createOperation();
};
#endif //HEAD_H
Head.cpp
#include "Head.h"
#include <iostream>
#include <string>
using namespace std;
Operation *IFactory::createOperation()
{
return nullptr;
}
Operation *AddFactory::createOperation()
{
return new AddOperation;
}
double Operation::getResult()
{
return -1;
}
AddOperation::AddOperation()
{
m_numberA = 0.0;
m_numberB = 0.0;
}
double AddOperation::getResult()
{
return m_numberA + m_numberB;
}
MultiOperation::MultiOperation()
{
m_numberA = 0.0;
m_numberB = 0.0;
}
double MultiOperation::getResult()
{
return m_numberA * m_numberB;
}
Operation * MultiFactory::createOperation()
{
return new MultiOperation;
}
main.cpp
#include "Head.h"
#include <iostream>
using namespace std;
int main(int *argc, int *argv){
IFactory *operAddFactory = new AddFactory;
Operation *addOper = operAddFactory->createOperation();
addOper->m_numberA = 100;
addOper->m_numberB = 200;
cout << "operAddFactory result is : " << addOper->getResult() << endl;
delete operAddFactory;
delete addOper;
cout << "--------------- 华丽的分割线 ---------------" << endl;
IFactory *operMultiFactory = new MultiFactory;
Operation *multiOper = operMultiFactory->createOperation();
multiOper->m_numberA = 12;
multiOper->m_numberB = 5;
cout << "operMultiFactory result is : " << multiOper->getResult() << endl;
delete operMultiFactory;
delete multiOper;
getchar();
return 0;
}