简介:
从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
我对简单工厂模式的理解:
1. 简单工厂模式的实现能让客户端那边节省很多工作。客户端只需实例化一个工厂类的对象,通过向工厂传进参数,并定义一个基类对象来接收工厂内部返回的实例即可。
2. 工厂模式的实现使得客户端不必管这些对象究竟如何创建及如何组织的,有利于整个软件体系结构的优化。
3. 简单工厂模式的UML图如下:
下面是用C++实现的简单Factory模式:
/*
* 文件名: Operation.h
* 说明:作为基类
*/
#pragma once
class Operation
{
private :
double m_Number1;
double m_Number2;
public:
Operation& SetNumber1(double num1);
const double GetNumber1() const;
Operation& SetNumber2(double num2);
const double GetNumber2() const;
const virtual double GetResult() const ; //计算结果
};
// 文件名: Operation.cpp
#include "stdafx.h"
#include "Operation.h"
Operation& Operation::SetNumber1(double num1)
{
this->m_Number1 = num1;
return *this;
}
const double Operation::GetNumber1() const
{
return m_Number1;
}
Operation& Operation::SetNumber2(double num2)
{
this->m_Number2 = num2;
return *this;
}
const double Operation::GetNumber2() const
{
return m_Number2;
}
const double Operation::GetResult() const
{
return 0;
}
/*
* 文件名:OperationAdd.h
* 说明: 继承Operation类
*/
#pragma once
#include "operation.h"
class OperationAdd :
public Operation
{
public:
const double GetResult() const; //覆写GetResult()
};
// 文件名: OperationAdd.cpp
#include "stdafx.h"
#include "OperationAdd.h"
const double OperationAdd::GetResult() const
{
return (GetNumber1()+GetNumber2());
}
/*
* 文件名:OperationFactory.h
* 说明: 工厂类,根据客户端所传参数动态实例化相应对象
*/
#pragma once
#include "Operation.h"
#include <string>
class OperationFactory
{
public:
//因为这里定义成静态函数,所以没办法访问非静态成员变量,
//所以Operation对象只能在函数体中定义指针变量,而不能定义成员变量
//这跟java和C#有些不同
static Operation* CreateOperate(std::string operate);
};
#include "stdafx.h"
#include "OperationFactory.h"
#include "OperationAdd.h"
#include "OperationSub.h"
#include "OperationMul.h"
#include "OperationDev.h"
Operation* OperationFactory::CreateOperate(std::string operate)
{
//C++中switch语句中的参数不能为字符串,所以用if语句判断了
Operation *m_oper;
if(operate == "+")
m_oper = new OperationAdd();
else if(operate == "-")
m_oper = new OperationSub();
else if(operate == "*")
m_oper = new OperationMul();
else if(operate == "/")
m_oper = new OperationDev();
else
throw("未找到合适的操作");
return m_oper;
}
/*
* 文件名: SimpleCalculator.cpp
* 说明: 定义应用程序的入口点-->main函数
*/
#include "stdafx.h"
#include "OperationFactory.h"
#include <iostream>
int _tmain(int argc, _TCHAR* argv[])
{
Operation *oper; //定义基类对象
oper = OperationFactory::CreateOperate("+"); //通过传进参数获得对象
oper->SetNumber1(4).SetNumber2(3); //设置操作数
std::cout<<"结果为:"<<oper->GetResult()<<std::endl; //计算结果
return 0;
}
就这个程序而言,当你需要添加其他运算方式(如实现一个开方sqrt()功能)时,只需要定义一个类继承于Operation类,然后实现其功能即可,而无需改动其他类中的代码。做到了低耦合。而当操作多变时就需要用到策略模式了,详细待见2.策略模式哈。。。
以上说法或代码有误望指出,小弟感激不尽 !!!