一.简单工厂模式又称静态工厂方法模式(Static Factory Method),它不是Gof 所讲的23种设计模式之一,但是它却是我们在编码过程中经常使用的方法之一。
1.静态工厂方法统一管理对象的创建。
静态工厂方法通过传入的参数判断决定创建哪一个产品的实例,封装了对象的创建,客户端只管消费,实现了对责任(模块)的分割。
2.静态工厂方法推迟了产品的实例化。
通过XML配置文件就能改变具体要创建的产品实例,修改为其它的产品实例,代码不须重新编译。
二.简单工厂模式还是有缺点的,后面的工厂方法模式和抽象工厂模式就是对这些缺点的改善。讲完了这三种模式将会有一个对比。以下以Nokia手机为例,采用简单工厂模式设计的源代码雏形。
CNokia::CNokia(void)
{
}
CNokia::~CNokia(void)
{
}
#pragma once
#include "nokia.h"
class CN96 : public CNokia
{
public:
CN96(void);
public:
virtual ~CN96(void);
public:
virtual bool MakeCall(const std::string & number) const;
};
/* N96型号的Nokia手机产品类 */
#include "N96.h"
CN96::CN96(void)
{
std::cout << "生产一部N96" << std::endl;
}
CN96::~CN96(void)
{
}
bool CN96::MakeCall(const std::string & number) const
{
std::cout << "我在用N96,拨打号码是:" << number.c_str() << std::endl;
return false;
}
#pragma once
#include "nokia.h"
class CN95 :public CNokia
{
public:
CN95(void);
public:
virtual ~CN95(void);
public:
virtual bool MakeCall(const std::string & number) const;
};
/* N95型号的Nokia手机产品类 */
#include "N95.h"
CN95::CN95(void)
{
std::cout << "生产一部N95" << std::endl;
}
CN95::~CN95(void)
{
}
bool CN95::MakeCall(const std::string & number) const
{
std::cout << "我在用N95,拨打号码是:" << number.c_str() << std::endl;
return false;
}
/*N85, N81, ...*/
/* 工厂类 */
#pragma once
#include "N96.h"
#include "N95.h"
#include "N85.h"
#include "N81.h"
#include <cassert>
class CNokiaSimpleFactory
{
public:
CNokiaSimpleFactory(void);
public:
~CNokiaSimpleFactory(void);
public:
/* 静态工厂方法 */
static CNokia * CreateNokia(const std::string & model);
};
#include "NokiaSimpleFactory.h"
CNokiaSimpleFactory::CNokiaSimpleFactory(void)
{
}
CNokiaSimpleFactory::~CNokiaSimpleFactory(void)
{
}
CNokia * CNokiaSimpleFactory::CreateNokia(const std::string & model)
{
if (model == "N96")
{
return new CN96();
}
else if (model == "N95")
{
return new CN95();
}
else if (model == "N85")
{
return new CN85();
}
else if (model == "N81")
{
return new CN81();
}
else
{
assert(false);
}
return NULL;
}
/* main方法,可以看做客户端 */
#include "stdafx.h"
#include "NokiaSimpleFactory.h"
int _tmain(int argc, _TCHAR* argv[])
{
CNokia * nokia = NULL;
/*
modeName 可以从外部XML文件中读取,运行过程中动态的
决定该创建哪一种型号的手机
*/
std::string modeName = "N96";
nokia = CNokiaSimpleFactory::CreateNokia(modeName);
nokia->MakeCall("123456789");
delete nokia;
nokia = NULL;
return 0;
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/chollima/archive/2009/03/12/3985570.aspx