C++工厂方法之对象创建型模式详解_第1页
C++工厂方法之对象创建型模式详解_第2页
C++工厂方法之对象创建型模式详解_第3页
C++工厂方法之对象创建型模式详解_第4页
C++工厂方法之对象创建型模式详解_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第C++工厂方法之对象创建型模式详解目录1.代码示例2.工厂方法模式的定义(实现意图)总结

1.代码示例

工厂方法模式,简称工厂模式或者多态工厂模式。与简单工厂模式相比,引入了更多的新类,灵活性更强,实现也更加复杂。符合开闭原则,付出的代价是需要新增加多个新的工厂类。

如下,M_UndeadFactory、M_ElementFactory、M_MechanicFactory类有一个共同的父类M_ParFactory(工厂抽象类)。

M_ParFactory类中的createMonster成员函数其实就是个工厂方法,工厂方法模式的名字也是由此而来。

#includeiostream

usingnamespacestd;

//怪物父类

classMonster

public:

//构造函数

Monster(intlife,intmagic,intattack):m_life(life),m_magic(magic),m_attack(attack){}

virtual~Monster(){}//父类的析构函数应该为虚函数

protected://可能被子类访问的成员,所以用protected修饰

intm_life;//生命值

intm_magic;//魔法值

intm_attack;//攻击力

//亡灵类怪物

classM_Undead:publicMonster

public:

//构造函数

M_Undead(intlife,intmagic,intattack):Monster(life,magic,attack)

cout"一个亡灵类怪物来到了这个世界"endl;

//其他代码略

//元素类怪物

classM_Element:publicMonster

public:

//构造函数

M_Element(intlife,intmagic,intattack):Monster(life,magic,attack)

cout"一个元素类怪物来到了这个世界"endl;

//其他代码略

//机械类怪物

classM_Mechanic:publicMonster

public:

//构造函数

M_Mechanic(intlife,intmagic,intattack):Monster(life,magic,attack)

cout"一个机械类怪物来到了这个世界"endl;

//其他代码略

//所有工厂类的父类

classM_ParFactory

public:

virtualMonster*createMonster()=0;//具体实现在子类中进行

virtual~M_ParFactory(){}//父类的析构函数应该为虚函数

//M_Undead怪物类型的工厂,生产M_Undead类型怪物

classM_UndeadFactory:publicM_ParFactory

public:

virtualMonster*createMonster()

Monster*ptmp=newM_Undead(300,50,80);//创建亡灵类怪物

//这里可以增加一些其他业务代码

returnptmp;

//M_Element怪物类型的工厂,生产M_Element类型怪物

classM_ElementFactory:publicM_ParFactory

public:

virtualMonster*createMonster()

returnnewM_Element(200,80,100);//创建元素类怪物

//M_Mechanic怪物类型的工厂,生产M_Mechanic类型怪物

classM_MechanicFactory:publicM_ParFactory

public:

virtualMonster*createMonster()

returnnewM_Mechanic(400,0,110);//创建机械类怪物

//全局函数:用于创建怪物对象

//注意:形参的类型是工厂父类类型的指针,返回类型是怪物父类类型的指针

Monster*Gbl_CreateMonster(M_ParFactory*factory)

returnfactory-createMonster();

//createMonster虚函数扮演了多态new的行为,factory指向的具体怪物工厂类不同,创建的怪物对象也不同

intmain()

M_ParFactory*p_ud_fy=newM_UndeadFactory();//多态工厂,注意指针类型

Monster*pM1=Gbl_CreateMonster(p_ud_fy);//产生了一只亡灵类怪物,也是多态,注意返回类型

//当然,这里也可以直接写成Monster*pM1=p_ud_fy-createMonster();

M_ParFactory*p_elm_fy=newM_ElementFactory();

Monster*pM2=Gbl_CreateMonster(p_elm_fy);//产生了一只元素类怪物

M_ParFactory*p_mec_fy=newM_MechanicFactory();

Monster*pM3=Gbl_CreateMonster(p_mec_fy);//产生了一只机械类怪物

//释放工厂

deletep_ud_fy;

deletep_elm_fy;

deletep_mec_fy;

//释放怪物

deletepM1;

deletepM2;

deletepM3;

return0;

简单工厂模式把创建对象这件事放到了一个统一的地方来处理,弹性比较差。而工厂方法模式相当于建立了一个程序实现框架,从而让子类来决定对象如何创建。

工厂方法模式往往需要创建一个与产品等级结构(层次)相同的工厂等级结构,这也增加了新类的层次结构和数目。

如果不想创建太多工厂类,又想封装变化,则可以创建怪物工厂子类模板。

#includeiostream

usingnamespacestd;

//怪物父类

classMonster

public:

//构造函数

Monster(intlife,intmagic,intattack):m_life(life),m_magic(magic),m_attack(attack){}

virtual~Monster(){}//父类的析构函数应该为虚函数

protected://可能被子类访问的成员,所以用protected修饰

intm_life;//生命值

intm_magic;//魔法值

intm_attack;//攻击力

//亡灵类怪物

classM_Undead:publicMonster

public:

//构造函数

M_Undead(intlife,intmagic,intattack):Monster(life,magic,attack)

cout"一个亡灵类怪物来到了这个世界"endl;

//其他代码略

//元素类怪物

classM_Element:publicMonster

public:

//构造函数

M_Element(intlife,intmagic,intattack):Monster(life,magic,attack)

cout"一个元素类怪物来到了这个世界"endl;

//其他代码略

//机械类怪物

classM_Mechanic:publicMonster

public:

//构造函数

M_Mechanic(intlife,intmagic,intattack):Monster(life,magic,attack)

cout"一个机械类怪物来到了这个世界"endl;

//其他代码略

//所有工厂类的父类

classM_ParFactory

public:

virtualMonster*createMonster()=0;//具体实现在子类中进行

virtual~M_ParFactory(){}//父类的析构函数应该为虚函数

templatetypenameT

classM_ChildFactory:publicM_ParFactory

public:

virtualMonster*createMonster()

returnnewT(300,50,80);//如果需要不同的值则可以通过createMonster的形参将值传递进来

intmain()

M_ChildFactoryM_UndeadmyFactory;

Monster*pM10=myFactory.createMonster();

//释放资源

deletepM10;

getchar();

return0;

UML如下:

2.工厂方法模式的定义(实现意图)

定义一个用于创建对象的接口(M_ParFactory类中的createMonster成员函数),由子类(M_UndeadFactory、M_ElementFactory、M_MechanicFacto

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论