设计模式——简单工厂

来源:互联网 发布:服装图设计软件 编辑:程序博客网 时间:2024/06/15 01:07

     在面对对象语言中设计模式就像少林师傅磨练徒弟的基本功时用的方法,挑挑水,砍砍柴。。。可能要的不是在这些方面多么精通,大多培养的是一种感觉吧,从c语言面向过程的思维慢慢转变成面对对象的思维方式。网上很多大牛都对面向对象与面向过程给出了很精确的解释,我也是受益匪浅,这里我也讲讲我对两种解决问题方式的理解。 

      面向过程,在面对一个问题时更多思考的是怎么得到想要的结果(其实在任何方式下都是要思考这个问题的),因此思维必须放在全局,需要连贯性,在编写函数时难度较大,并且写出的代码复用性可能很差,甚至需求上的一点小改动,整段代码都会废掉(相对低级的语言并不是只能面向过程,比如说c语言,它在设计的时候并没有面向对象的思维,并没有类的说法,但是我们在编程的过程能够函数模块化,写出与“高级语言”一样的代码美观,因此我们在这里讨论的编程人员在编程的过程中的思维方式,没有针对语言在设计之初的特性)。 

      面对对象,在人们发现上述问题时,厉害的前辈们想到,在编程的过程中我们能不能把问题聚焦在过程中每一个对象上,对象的健壮性以及他们之间的低耦合度,高聚合能力,将会使编程编程一项艺术,极大地开发编程人员的想象能力。当然现在能很轻易的了解到面对对象的特征,也有很多大牛对其做了很精彩的解释,我也抛砖引玉,谈谈我的理解。在写代码的过程中,我发现继承的真正目的是为了让你的解决问题更有层次感,在解决问题时有层层推进的感觉,其次多态性是为了解决不决定情况, 封装性在我用来可能是在使用函数时更方便。

     好了,前面只是为了面对对象的设计模式做铺垫,正式进入正题,简单工厂模式是最典型的实际模式,他也具体反应了面对对象编程的特性。主要思路如下:首先需要一个产品父类,它是虚基类,具体的产品子类通过public继承实现具体的业务逻辑,其次一个工厂类,其是具体产生产品实例的对象。很简单,就两条思路,客户在使用时只需要给工厂实例对象指令就能产生相应的产品。具体实现方法如下:

mainClass.h

#ifndef MAIN_CLASS

#define MAIN_CLASS

#includeusing namespace std;

class mainClass

{

public:mainClass();

~mainClass();

virtual bool dosome(char* string)=0; //纯虚函数

};

#endif

mainClass.cpp

//这里建文件望只是养成声明与实现分离的习惯,但是这里并不需要实现什么,就空下来啦#include"mainClass.h"

mainClass::mainClass()

{}

mainClass::~mainClass()

{}

subClass.h

#ifndef SUB_CLASS

#define SUB_CLASS

#include"mainClass.h"

class subClass :public mainClass

{

public:subClass();

~subClass();

bool dosome(char * string);private:};

#endif


subClass.cpp

#include"subClass.h"

bool subClass::dosome(char *string)

{printf("%s,这是实现子类", string);

return true;}

subClass::subClass(){}

subClass::~subClass(){}

subClass1.h

#ifndef SUB_CLASS1

#define SUB_CLASS1

#include"mainClass.h"

class subClass1:public mainClass

{

public:subClass1();

~subClass1();

bool dosome(char* string);private:};

#endif

subClass1.cpp

#include"subClass1.h"

bool subClass1::dosome(char * string){

printf("%s,这是实现子类1", string);

return true;}

subClass1::subClass1(){}

subClass1::~subClass1(){}

subClass2.h

#ifndef SUB_CLASS2

#define SUB_CLASS2

#include"mainClass.h"

class subClass2:public mainClass

{

public:subClass2();

~subClass2();

bool dosome(char *string);};

#endif

subClass2.cpp

#include"subClass2.h"

bool subClass2::dosome(char *string){printf("%s,这是实现子类2",string);

return true;}

subClass2::~subClass2()

{}

subClass2::subClass2()

{

}

FcMod.h

#ifndef FC_MOD_H

#define FC_MOD_H

#include"mainClass.h"

#include"subClass.h"

#include"subClass1.h"

#include"subClass2.h"

using namespace std;

class FcMod{

public:FcMod();

~FcMod();

bool creatClass(char *sign,mainClass * &pmain);

private:

};

#endif

FcMod.cpp

#include"FcMod.h"

bool FcMod::creatClass(char * sign, mainClass * &pmain){

switch (sign[0]){

case '0':pmain = new subClass();return true;

case '1':pmain = new subClass1();return true;

case '2':pmain = new subClass2();return true;

default:return false;}return true;}

FcMod::FcMod(){}

FcMod::~FcMod(){}

demo.cpp

//简单工厂模式简单实现,体现了基本面对对象编程的思路

#include"FcMod.h"

using namespace std;

int main(int argc, char argv[])

{

mainClass *pmain = nullptr;

FcMod fc;

char * ts = "hello world!!!";

if (fc.creatClass("0", pmain)){pmain->dosome(ts);}else{cout << "输入标志位有错" << endl;}

if (fc.creatClass("1",pmain)){pmain->dosome(ts);}else{cout << "输入的标志位有错" << endl;}

if (fc.creatClass("2", pmain)){pmain->dosome(ts);}else{cout << "输入的标志位有错" << endl;}

return 0;}

原创粉丝点击