求知 文章 文库 Lib 视频 Code iProcess 课程 认证 咨询 工具 火云堂 讲座吧   成长之路  
会员   
 
追随技术信仰

随时听讲座
每天看新闻
 
 

C语言和设计模式 教程
开篇
单件模式
原型模式
组合模式
模板模式
工厂模式
责任链模式
抽象工厂模式
迭代器模式
外观模式
代理模式
享元模式
装饰模式
适配器模式
策略模式
中介者模式
建造者模式
桥接模式
观察者模式
备忘录模式
解释器模式
命令模式
状态模式
访问者模式
继承、封装、多态
 
 

原型模式
27 次浏览
7次  
 捐助

原型模式本质上说就是对当前数据进行复制。就像变戏法一样,一个鸽子变成了两个鸽子,两个鸽子变成了三个鸽子,就这么一直变下去。在变的过程中,我们不需要考虑具体的数据类型。为什么呢?因为不同的数据有自己的复制类型,而且每个复制函数都是虚函数。

用C++怎么编写呢,那就是先写一个基类,再编写一个子类。就是这么简单。

class data  
{
public:
data () {}
virtual ~data() {}
virtual class data* copy() = 0;
};

class data_A : public data
{
public:
data_A() {}
~data_A() {}
class data* copy()
{
return new data_A();
}
};

class data_B : public data
{
public:
data_B() {}
~data_B() {}
class data* copy()
{
return new data_B();
}
};

那怎么使用呢?其实只要一个通用的调用接口就可以了。

class data* clone(class data* pData)  
{
return pData->copy();
}

就这么简单的一个技巧,对C来说,当然也不是什么难事。

typedef struct _DATA  
{
struct _DATA* (*copy) (struct _DATA* pData);
}DATA;

假设也有这么一个类型data_A,

DATA data_A = {data_copy_A};  

既然上面用到了这个函数,所以我们也要定义啊。

struct _DATA* data_copy_A(struct _DATA* pData)  
{
DATA* pResult = (DATA*)malloc(sizeof(DATA));
assert(NULL != pResult);
memmove(pResult, pData, sizeof(DATA));
return pResult;
};

使用上呢,当然也不含糊。

struct _DATA* clone(struct _DATA* pData)  
{
return pData->copy(pData);
};

 


您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码: 验证码,看不清楚?请点击刷新验证码 必填



27 次浏览
7次
 捐助
 

每天2个文档/视频
扫描微信二维码订阅
订阅技术月刊
获得每月300个技术资源
 
 

关于我们 | 联系我们 | 京ICP备10020922号 京公海网安备110108001071号