#include
#include
#include
/*抽象工厂模式范例。 类图参见设计模式之禅p79*/
/*抽象产品类*/
/*人种类*/
typedef struct _Human Human;
struct _Human
{
/*每个人种都有肤色*/
void (*getColor)(void);
/*人类会说话*/
void (*talk)(void);
/*人类有性别*/
void (*getSex)(void);
};
/*白色人种*/
typedef struct _AbstractWhiteHuman AbstractWhiteHuman;
struct _AbstractWhiteHuman
{
Human human; /*继承人种父类*/
void (*DeleteAbstractWhiteHuman)(AbstractWhiteHuman *pAbstractWhiteHuman);
};
void WhiteGetColor(void)
{
//do something
printf("白人的皮肤是白色的\n");
}
void WhiteTalk(void)
{
//do something
printf("白人会说话\n");
}
void DeleteAbstractWhiteHuman(AbstractWhiteHuman *pAbstractWhiteHuman)
{
if(NULL != pAbstractWhiteHuman)
free(pAbstractWhiteHuman);
}
AbstractWhiteHuman *CreateAbstractWhiteHuman(int size)
{
AbstractWhiteHuman *pAbstractWhiteHuman = (AbstractWhiteHuman*)malloc(size);
if(NULL == pAbstractWhiteHuman)
{
return pAbstractWhiteHuman;
}
memset(pAbstractWhiteHuman,0,size);
pAbstractWhiteHuman->DeleteAbstractWhiteHuman = DeleteAbstractWhiteHuman;
pAbstractWhiteHuman->human.getColor = WhiteGetColor;
pAbstractWhiteHuman->human.talk = WhiteTalk;
return pAbstractWhiteHuman;
}
/*黑色人种*/
/*代码略*/
/*黄色人种*/
/*代码略*/
/*具体产品类*/
/*白色女性人种*/
typedef struct _FemaleWhiteHuman FemaleWhiteHuman;
struct _FemaleWhiteHuman
{
AbstractWhiteHuman whiteHuman; /*继承白色人种父类*/
void (*getSex)(void);
void (*DeleteFemaleWhiteHuman)(FemaleWhiteHuman *pFemaleWhiteHuman);
};
void FemaleWhiteHumanGetSex(void)
{
printf("白人女性\n");
}
void DeleteFemaleWhiteHuman(FemaleWhiteHuman *pFemaleWhiteHuman)
{
if(NULL != pFemaleWhiteHuman)
{
free(pFemaleWhiteHuman);
}
return;
}
FemaleWhiteHuman *CreateFemaleWhiteHuman(void) /*白人女性构造函数*/
{
FemaleWhiteHuman *pFemaleWhiteHuman =
(FemaleWhiteHuman *)CreateAbstractWhiteHuman(sizeof(FemaleWhiteHuman));
if(NULL == pFemaleWhiteHuman)
{
return pFemaleWhiteHuman;
}
pFemaleWhiteHuman->getSex = FemaleWhiteHumanGetSex;
pFemaleWhiteHuman->DeleteFemaleWhiteHuman = DeleteFemaleWhiteHuman;
pFemaleWhiteHuman->whiteHuman.human.getSex = pFemaleWhiteHuman->getSex;
return pFemaleWhiteHuman;
}
/*白色男性人种*/
typedef struct _MaleWhiteHuman MaleWhiteHuman;
struct _MaleWhiteHuman
{
AbstractWhiteHuman whiteHuman; /*继承白色人种父类*/
void (*getSex)(void);
void (*DeleteMaleWhiteHuman)(MaleWhiteHuman *pMaleWhiteHuman);
};
void MaleWhiteHumanGetSex(void)
{
printf("白人男性\n");
}
void DeleteMaleWhiteHuman(MaleWhiteHuman *pMaleWhiteHuman)
{
if(NULL != pMaleWhiteHuman)
{
free(pMaleWhiteHuman);
}
return;
}
MaleWhiteHuman *CreateMaleWhiteHuman(void) /*白人男性构造函数*/
{
MaleWhiteHuman *pMaleWhiteHuman =
(MaleWhiteHuman *)CreateAbstractWhiteHuman(sizeof(MaleWhiteHuman));
if(NULL == pMaleWhiteHuman)
{
return pMaleWhiteHuman;
}
pMaleWhiteHuman->getSex = MaleWhiteHumanGetSex;
pMaleWhiteHuman->DeleteMaleWhiteHuman = DeleteMaleWhiteHuman;
pMaleWhiteHuman->whiteHuman.human.getSex = pMaleWhiteHuman->getSex;
return pMaleWhiteHuman;
}
/*黑色女性人种*/
/*代码略*/
/*黑色男性人种*/
/*代码略*/
/*黄色女性人种*/
/*代码略*/
/*黄色男性人种*/
/*代码略*/
/*抽象工厂类*/
/*八卦炉*/
typedef struct _HumanFactory HumanFactory;
struct _HumanFactory
{
Human *(*CreateYellowHuman)(void);
Human *(*CreateWhiteHuman)(void);
Human *(*CreateBlackHuman)(void);
void (*DeleteHumanFactory)(HumanFactory *pHumanFactory);
};
void DeleteHumanFactory(HumanFactory *pHumanFactory)
{
if(NULL != pHumanFactory)
{
free(pHumanFactory);
pHumanFactory = NULL;
}
}
HumanFactory *CreateHumanFactory(void)
{
HumanFactory *pHumanFactory = (HumanFactory *)malloc(sizeof(HumanFactory));
if(NULL == pHumanFactory)
{
return pHumanFactory;
}
memset(pHumanFactory, 0, sizeof(HumanFactory));
pHumanFactory->DeleteHumanFactory = DeleteHumanFactory;
return pHumanFactory;
}
/*具体工厂类*/
/*生产女性的八卦炉*/
typedef struct _FemaleFactory FemaleFactory;
struct _FemaleFactory
{
HumanFactory humanFactory;
};
Human *FemaleFactoryCreateWhite(void)
{
Human *pHuman = NULL;
pHuman = (Human *)CreateFemaleWhiteHuman();
return pHuman;
}
Human *FemaleFactoryCreateBlack(void)
{
Human *pHuman = NULL;
//pHuman = (Human *)CreateFemaleBlackHuman();
return pHuman;
}
Human *FemaleFactoryCreateYellow(void)
{
Human *pHuman = NULL;
//pHuman = (Human *)CreateFemaleYellowHuman();
return pHuman;
}
FemaleFactory *CreateFemaleFactory(void)
{
FemaleFactory *pFemaleFactory = (FemaleFactory *)CreateHumanFactory();
if(NULL == pFemaleFactory)
{
return pFemaleFactory;
}
pFemaleFactory->humanFactory.CreateYellowHuman = FemaleFactoryCreateYellow;
pFemaleFactory->humanFactory.CreateWhiteHuman = FemaleFactoryCreateWhite;
pFemaleFactory->humanFactory.CreateBlackHuman = FemaleFactoryCreateBlack;
return pFemaleFactory;
}
/*生产男性的八卦炉*/
typedef struct _MaleFactory MaleFactory;
struct _MaleFactory
{
HumanFactory humanFactory;
};
Human *MaleFactoryCreateWhite(void)
{
Human *pHuman = NULL;
pHuman = (Human *)CreateMaleWhiteHuman();
return pHuman;
}
Human *MaleFactoryCreateBlack(void)
{
Human *pHuman = NULL;
//pHuman = (Human *)CreateMaleBlackHuman();
return pHuman;
}
Human *MaleFactoryCreateYellow(void)
{
Human *pHuman = NULL;
//pHuman = (Human *)CreateMaleYellowHuman();
return pHuman;
}
MaleFactory *CreateMaleFactory(void)
{
MaleFactory *pMaleFactory = (MaleFactory *)CreateHumanFactory();
if(NULL == pMaleFactory)
{
return pMaleFactory;
}
pMaleFactory->humanFactory.CreateYellowHuman = MaleFactoryCreateYellow;
pMaleFactory->humanFactory.CreateWhiteHuman = MaleFactoryCreateWhite;
pMaleFactory->humanFactory.CreateBlackHuman = MaleFactoryCreateBlack;
return pMaleFactory;
}
/*场景代码*/
void main(void)
{
Human *pfemaleWhiteHuman = NULL;
Human *pmaleWhiteHuman = NULL;
HumanFactory *pMaleHumanFactory = NULL;
HumanFactory *pFemaleHumanFactory = NULL;
/*第一条生产线, 男性生产线*/
pMaleHumanFactory = (HumanFactory *)CreateMaleFactory();
/*第二条生产线,女性生产线*/
pFemaleHumanFactory = (HumanFactory *)CreateFemaleFactory();
if((NULL == pMaleHumanFactory)||(NULL == pFemaleHumanFactory))
{
//printf
return;
}
/*工厂开始工作*/
pfemaleWhiteHuman = pFemaleHumanFactory->CreateWhiteHuman();
if(NULL == pfemaleWhiteHuman)
{
//printf
return;
}
printf("--生产出一个白人女性--\n");
pfemaleWhiteHuman->getColor();
pfemaleWhiteHuman->talk();
pfemaleWhiteHuman->getSex();
pmaleWhiteHuman = pMaleHumanFactory->CreateWhiteHuman();
if(NULL == pmaleWhiteHuman)
{
//printf
return;
}
printf("--生产出一个白人男性--\n");
pmaleWhiteHuman->getColor();
pmaleWhiteHuman->talk();
pmaleWhiteHuman->getSex();
/*后面继续创建*/
/*释放资源*/
pMaleHumanFactory->DeleteHumanFactory(pMaleHumanFactory);
pFemaleHumanFactory->DeleteHumanFactory(pFemaleHumanFactory);
free(pmaleWhiteHuman);
pmaleWhiteHuman = NULL;
free(pfemaleWhiteHuman);
pfemaleWhiteHuman = NULL;
return;
}
C语言实现《设计模式之禅》之工厂模式——抽象工厂
最新推荐文章于 2024-08-31 22:22:34 发布