一.简单工厂模式又称静态工厂方法模式(Static Factory Method),它不是Gof 所讲的23种设计模式之一,但是它却是我们在编码过程中经常使用的方法之一。
1.静态工厂方法统一管理对象的创建。 2.静态工厂方法推迟了产品的实例化。
二.简单工厂模式还是有缺点的,后面的工厂方法模式和抽象工厂模式就是对这些缺点的改善。讲完了这三种模式将会有一个对比。以下以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; } |
|