文档章节

C 语言 标准工厂模式

小张525
 小张525
发布于 2017/03/25 22:48
字数 554
阅读 5
收藏 0
// main.h

#ifndef MAIN_H
#define MAIN_H

// parent
typedef struct _Human Human;
struct _Human
{
	void (*GetColor)(void);
	void (*Talk)(void);
	void *DeriveObj;     //派生类的地址.
};


// black
typedef struct _BlackHuman BlackHuman;
struct _BlackHuman
{
	Human *Human;
	void (*GetColorForBlack)(void);
	void (*TalkForBlack)(void);
	void (*DeleteOfBlack)(BlackHuman* human);
};

// white
typedef struct _WhiteHuman WhiteHuman;
struct _WhiteHuman
{
	Human *Human;
	void (*GetColorForWhite)(void);
	void (*TalkForWhite)(void);
	void (*DeleteOfWhite)(WhiteHuman* human);
};

typedef struct _AbstractFactory AbstractFactory;
struct _AbstractFactory{
	Human *(*CreateHuman)(char* pString);
	void *DeriveObj;  //派生类的地址.
};


typedef struct _HumanFactory HumanFactory;

struct _HumanFactory{
	AbstractFactory *AbHumanFactory;
	Human* (*CreateHuman)(char* pString);
	void (*DeleteHumanFactory)(HumanFactory *);
};

#endif


// main.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "main.h"
#ifndef VLD_H
#include <vld.h>
#endif


void GetColorForBlack(void)
{
	printf("human color is black\r\n");	
}

void GetColorForWhite(void)
{
	printf("human color is white\r\n");
}



void TalkForBlack(void)
{
	printf("human talk english\r\n");
}

void TalkForWhite(void)
{
	printf("human talk japan\r\n");
}



void DeleteOfBlack(BlackHuman* human)
{
	if(NULL != human)
	{
		if(NULL != human->Human)
		{
			free(human->Human);
		}
		free(human);
	}
	return ;
}

void DeleteOfWhite(WhiteHuman* human)
{
	if(NULL != human)
	{
		if(NULL != human->Human)
		{
			free(human->Human);
		}
		free(human);
	}
	return ;
}




// 如果是静态处理, 是否是地址上有所区别,
Human *CreateBlackHuman(void)
{
	BlackHuman *blackhuman = (BlackHuman *)malloc(sizeof(BlackHuman));
	if(NULL == blackhuman)
	{
		return NULL;	
	}else{
		Human *human = (Human*)malloc(sizeof(Human));
		if(NULL == human)
		{
			free(blackhuman);
			return NULL;
		}else{
			//保存派生类的地址,
			human->DeriveObj = blackhuman;
			blackhuman->Human = human;
			blackhuman->GetColorForBlack=GetColorForBlack;
			blackhuman->TalkForBlack= TalkForBlack;
			blackhuman->DeleteOfBlack=DeleteOfBlack;
			blackhuman->Human->GetColor=blackhuman->GetColorForBlack;
			blackhuman->Human->Talk=blackhuman->TalkForBlack;
			return human;
		}
	}
}

Human* CreateWhiteHuman(void)
{
	WhiteHuman *whitehuman = (WhiteHuman *)malloc(sizeof(WhiteHuman));
	if(NULL == whitehuman)
	{
		return NULL;	
	}else{
		Human *human = (Human*)malloc(sizeof(Human));
		if(NULL == human)
		{
			free(whitehuman);
			return NULL;
		}else{
			//保存派生类的地址,
			human->DeriveObj = whitehuman;
			whitehuman->Human = human;
			whitehuman->GetColorForWhite=GetColorForWhite;
			whitehuman->TalkForWhite= TalkForWhite;
			whitehuman->DeleteOfWhite=DeleteOfWhite;
			whitehuman->Human->GetColor=whitehuman->GetColorForWhite;
			whitehuman->Human->Talk=whitehuman->TalkForWhite;
			//返回父类的地址.
			return human;
		}
	}
}




// 指向父类的地址.
Human *CreateHuman(char* pstring)
{
	Human *pHuman =NULL;

	if(0 == strcmp(pstring,"Black"))
	{
		pHuman =(Human*)CreateBlackHuman();
	}

	if(0 == strcmp(pstring,"White"))
	{
		pHuman = (Human*)CreateWhiteHuman();
	}

	return pHuman;
}

void DeleteHumanFactory(HumanFactory *pHumanFactory)
{
	if(NULL != pHumanFactory)
	{
		if(pHumanFactory->AbHumanFactory != NULL)
		{
			free(pHumanFactory->AbHumanFactory);
		}
		free(pHumanFactory);
	}
	return ;
}

// 工厂实例
AbstractFactory *CreateHumanFactory(void)
{
	HumanFactory *pHumanFactory = (HumanFactory *)malloc(sizeof(HumanFactory));
	if(NULL == pHumanFactory)
	{
		return NULL;
	}else{
		AbstractFactory *pAbstractFactory= (AbstractFactory *)malloc(sizeof(AbstractFactory));

		if(NULL == pAbstractFactory)
		{
			free(pHumanFactory);
			return NULL;
		}else{
			//保存子类的地址.
			pAbstractFactory->DeriveObj=pHumanFactory;
			pHumanFactory->AbHumanFactory = pAbstractFactory;
			pHumanFactory->CreateHuman= CreateHuman;
			pHumanFactory->DeleteHumanFactory=DeleteHumanFactory;
			pHumanFactory->AbHumanFactory->CreateHuman = pHumanFactory->CreateHuman;
			// 返回父类的地址.
			return pAbstractFactory;
		}
	}
}

int main()
{
	//强制转化把内容忽略了.
	AbstractFactory *p= CreateHumanFactory();
	Human *pBlack=NULL;
	Human *pWhite=NULL;
	HumanFactory *pHumanFactory=NULL;
	BlackHuman *pBlackHuman= NULL;
	WhiteHuman *pWhiteHuman=NULL;
	pBlack = p->CreateHuman("Black");
	pBlack->GetColor();
	pBlack->Talk();

	pWhite = p->CreateHuman("White");
	pWhite->GetColor();
	pWhite->Talk();

	//
	//BlackHuman *blackhuman=NULL;
	//blackhuman = CreateBlackHuman();

	//if(NULL == blackhuman)
	//{
	//	printf("create blackhuman faile\r\n");
	//	return 0;
	//}

	//blackhuman->GetColorForBlack();
	//blackhuman->TalkForBlack();
	//blackhuman->DeleteOfBlack(blackhuman);

	// convert
	pHumanFactory = (HumanFactory*)p->DeriveObj;
	pHumanFactory->DeleteHumanFactory(pHumanFactory);

	// convert
	pBlackHuman =(BlackHuman*)pBlack->DeriveObj;
	pBlackHuman->DeleteOfBlack(pBlackHuman);

	pWhiteHuman =(WhiteHuman*)pWhite->DeriveObj;
	pWhiteHuman->DeleteOfWhite(pWhiteHuman);

	return 0;
}


 

© 著作权归作者所有

上一篇: C 语言 标准工厂,
下一篇: C 语言queue
小张525
粉丝 6
博文 110
码字总数 37385
作品 0
乌鲁木齐
程序员
私信 提问
在JavaScript中理解策略模式

设计模式是: 在面向对象软件过程中针对特定问题的简洁而优雅的解决方案. 通过对封装、继承、多态、组合等技术的反复利用, 提炼出可重复使用面向对象的设计技巧. JavaScript 可以模拟实现传统...

夜曉宸
01/27
0
0
设计模式已经陨落了?

你现在是坐在一个程序员旁边吗?如果是的话,那么在你读下面的段落之前,有一个简单的实验。让他们到一边去,问问他们两个问题并记录下答案。首先问他们“什么是设计模式?”然后再问“说出你...

oschina
2014/03/11
9.1K
69
学了那么多年设计模式依然不会用!那可真蠢!

什么是设计模式? 设计模式(Design Pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决...

GitChat技术杂谈
2018/10/26
0
0
JavaScript 常见设计模式

前言 设计模式,这一话题一直都是程序员谈论的"高端"话题之一。许多程序员从设计模式中学到了设计软件的灵感和解决方案。 有人认为设计模式只在 C++或者 Java 中有用武之地,JavaScript 这种...

YeeWang王大白
03/08
0
0
编程中的那些套路——关于适配器模式

该文章属于《编程中的那些经典套路——设计模式汇总》系列,并且以下内容基于语言PHP 今天我们来谈谈适配器模式。 想象一个场景: 有一个类方法它部署在服务器上,专门负责大多数语言都通用的...

gzchen
2018/08/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

聊聊Elasticsearch的MonitorService

序 本文主要研究一下Elasticsearch的MonitorService MonitorService elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/monitor/MonitorService.java public class MonitorServic......

go4it
42分钟前
3
0
二、Docker

1、Docker - The TLDR(Too Long,Don't Read,Linxu 终端工具 ) Docker是在Linux和Windows上运行的软件。它创建、管理和编排容器。该软件以开源方式开发,在Github上作为Moby开源项目的一部分。...

倪伟伟
55分钟前
3
0
Python猫荐书系列之七:Python入门书籍有哪些?

本文原创并首发于公众号【Python猫】,未经授权,请勿转载。 原文地址:https://mp.weixin.qq.com/s/ArN-6mLPzPT8Zoq0Na_tsg 最近,猫哥的 Python 技术学习群里进来了几位比较特殊的同学:一...

豌豆花下猫
今天
5
0
Guava RateLimiter限流源码解析和实例应用

在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流 缓存 缓存的目的是提升系统访问速度和增大系统处理容量 降级 降级是当服务出现问题或者影响到核心流程时,需要暂时屏蔽掉,待高...

算法之名
今天
13
0
国产达梦数据库与MySQL的区别

背景 由于项目上的需要,把项目实现国产化,把底层的MySQL数据库替换为国产的达梦数据库,花了一周的时间研究了国产的数据库-达梦数据库,它和MySQL有一定的区别,SQL的写法也有一些区别。 ...

TSMYK
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部