简单工厂模式

一.简单工厂模式又称静态工厂方法模式(Static Factory Method),它不是Gof 所讲的23种设计模式之一,但是它却是我们在编码过程中经常使用的方法之一。

 

1.静态工厂方法统一管理对象的创建。
静态工厂方法通过传入的参数判断决定创建哪一个产品的实例,封装了对象的创建,客户端只管消费,实现了对责任(模块)的分割。

2.静态工厂方法推迟了产品的实例化。
通过XML配置文件就能改变具体要创建的产品实例,修改为其它的产品实例,代码不须重新编译。

 

二.简单工厂模式还是有缺点的,后面的工厂方法模式和抽象工厂模式就是对这些缺点的改善。讲完了这三种模式将会有一个对比。以下以Nokia手机为例,采用简单工厂模式设计的源代码雏形。

  1. /* Nokia抽象产品 */  
  2. #pragma once   
  • #include <string>   
  • #include <iostream>   
  • class CNokia  
  • {  
  • public:  
  •     CNokia(void);  
  • public:  
  •     virtual ~CNokia(void);  
  • public:  
  •     virtual bool MakeCall(const std::string & number) const = 0;  
  • };  
  • #include "Nokia.h"   
  •   
  • 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;  
  • }  

 

posted on 2012-05-26 23:55  很多不懂呀。。  阅读(261)  评论(1编辑  收藏  举报

导航