-
上一篇我分享了我对面对对象编程的理解,还分享了一个最简单的设计模式-简单工厂模式,这一篇我们来看一个类似的设计模式,工厂方法模式。我的理解是原本在简单工厂模式下,产品的产生逻辑和方法是被工厂类封装好的,只需要客户去调用函数产生产品,而在工厂方法模式下,产品的产生方法是被封装好了的(封装在子工厂类中),但产品的产生逻辑是有客户去控制的,这是他们之间最主要的区别。
其主要实现思路比较简单,如下:一个产品的父类,以及其具体产品的子类。
工厂类父类,以及具体到每个产品的工厂子类(工厂父类规定了创造那类产品,子类规定了这类产品的那个型号),工厂子类包含了创建产品的具体细节。
客户在使用时就创建一个父类的指针指向的时具体产品工厂,然后再产品指针=其父类指针调用的具体create函数。(这样就避免了客户并不知道产品子类的名称,且不需要要客户知道产品实例化的过程)
下面是我写的测试代码,欢迎交流:
//mianClass.h
#ifndef MIAN_CLASS
#define MAIN_CLASS
#include<iostream>
#pragma once
using namespace std;
class mainClass
{
public:
mainClass();
~mainClass();
virtual bool dosome(char *string ) = 0;
//纯虚函数,需要子类实现具体的功能
private:
};
#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"
subClass::subClass()
{
}
subClass::~subClass()
{
}
bool subClass::dosome(char* string)
{
printf("%s,当前子类实现", string);
return true;
}
//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"
subClass1::subClass1()
{
}
subClass1::~subClass1()
{
}
bool subClass1::dosome(char *string)
{
printf("%s,这是子类1实现", string);
return true;
}
//subClass2.h
#ifndef SUB_CALSS2
#define SUB_CLASS2
#include"mainClass.h"
class subClass2 :public mainClass
{
public:
subClass2();
~subClass2();
bool dosome(char* string);
private:
};
#endif // !SUB_CALSS2
//subClass2.cpp
#include"subClass2.h"
subClass2::subClass2()
{
}
subClass2::~subClass2()
{
}
bool subClass2::dosome(char * string)
{
printf("%s,这是子类2实现", string);
return true;
}
//FFcMod.h
#ifndef FFC_MO D
#define FFC_MOD
#include<iostream>
#include"mainClass.h"
#pragma once
using namespace std;
class FFcMod
{
public:
FFcMod();
~FFcMod();
virtual bool getchclass(mainClass* &pmianclass)=0;
private:
};
#endif
//FFcMod.cpp
#include"FFcMod.h"
FFcMod::FFcMod()
{
}
FFcMod::~FFcMod()
{
}
//chFcMod.h
#ifndef CH_FC_MOD
#define CH_FV_MOD
#include"FFCMod.h"
class chFcMod:public FFcMod
{
public:
chFcMod();
~chFcMod();
bool getchclass(mainClass* &pmainclass);
private:
};
#endif
//chFcMod.cpp
#include"chFcMod.h"
#include"subClass.h"
chFcMod::chFcMod()
{
}
chFcMod::~chFcMod()
{
}
bool chFcMod::getchclass(mainClass* &pmainclass){
pmainclass = new subClass();
return true;
}
//chFcMod1.h
#ifndef CH_FC_MOD1
#define CH_FC_MOD1
#include"FFcMod.h"
class chFcMod1:public FFcMod
{
public:
chFcMod1();
~chFcMod1();
bool getchclass(mainClass* &pmainclass);
private:
};
#endif
//chFcMod1.cpp
#include"chFcMod1.h"
#include"subClass1.h"
chFcMod1::chFcMod1()
{
}
chFcMod1::~chFcMod1()
{
}
bool chFcMod1::getchclass(mainClass* &pmainclass)
{
pmainclass = new subClass1();
return true;
}
//chFcMod2.h
#ifndef CH_FC_MOD2
#define CH_FC_MOD2
#include"FFcMod.h"
class chFcMod2:public FFcMod
{
public:
chFcMod2();
~chFcMod2();
bool getchclass(mainClass* &pmainclass);
private:
};
#endif
//chFcMod2.cpp
#include"chFcMod2.h"
#include"subClass2.h"
chFcMod2::chFcMod2()
{
}
chFcMod2::~chFcMod2()
{
}
bool chFcMod2::getchclass(mainClass* &pmainclass)
{
pmainclass = new subClass2();
return true;
}
//demo.cpp
#include"FFcMod.h"
#include"chFcMod.h"
#include"chFcMod1.h"
#include"chFcMod2.h"
#include<iostream>
int main(int argv, char args[])
{
mainClass *pmain=nullptr;
FFcMod *pffcmod = nullptr;
pffcmod = new chFcMod();
pffcmod->getchclass(pmain);
pmain->dosome("hello world!!!");
pffcmod = new chFcMod1();
pffcmod->getchclass(pmain);
pmain->dosome("hello world!!!");
pffcmod = new chFcMod2();
pffcmod->getchclass(pmain);
pmain->dosome("hello world!!!");
return 0;
}