C语言实现《设计模式之禅》之工厂模式——抽象工厂

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


     
     
    
    
   
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值