分享

简单工厂模式(C++描述)

 幸福的乐土 2012-09-16

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

 

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

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

 

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

/* Nokia抽象产品 */

#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;

}



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多