C#实现工厂方法模式_第1页
C#实现工厂方法模式_第2页
C#实现工厂方法模式_第3页
C#实现工厂方法模式_第4页
C#实现工厂方法模式_第5页
全文预览已结束

下载本文档

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

文档简介

第C#实现工厂方法模式场景:简单工厂时候,我设计了一个场景,有三种剑去打怪,这时候,需求变化了,我三种剑变成了,匕首、剑以及木棒,想要用工厂方法来实现,怎么弄?

1.上文讲过简单工厂模式,它的最大优点在于工厂类内有创建类型的判断逻辑,客户端只需要通过动态的选择想要创建的类型,就可以交给工厂类来创建,去除了客户与具体产品之间的依赖。

缺点在于,当新建一个类型的时候,需要修正工厂类中的判断逻辑,添加一个case,此时就违背了开放-封闭原则。

2.工厂方法模式的引入:定义一个用于创建对象的接口,让子类觉得实例化哪一个类,工厂方法模式使得一个类的实例化延迟到了它的子类。

客户端再使用工厂方法模式的时候,需要决定实例化哪一种工厂,选择判断的问题依然存在,也就是说工厂方法模式是对简单工厂的改进,把判断逻辑移动到了客户端。当加入新功能时候,原来是要修正工厂类,现在修改客户端就行了。

领悟:例如在进行编写一个计算器的时候。

①如果把所有的判断逻辑和类的创建放在一个类中,那么出现的问题是,新增加一个功能,其他的功能也会收到影响。所以引进了简单工厂模式,使得耦合性降低了。②简单工厂在添加新功能的时候,需要改工厂类,同样违背开放-封闭原则,对更改是关闭的,对扩展是开放的。③针对简单工厂又出现了工厂方法,这时候将工厂类进一步抽象为多个工厂类。这时候我添加一个新功能,就需要添加一个新的工厂类和一个具体的功能类。工作量也变大了。

Product:抽象产品

ConcreteProduct:具体产品

Factory:抽象工厂

ConcreteFactory:具体工厂

3.代码实现:

Weapon.cs

namespaceFactoryMethod

publicclassWeapon

//设计一个怪兽,血量是100(其实并不是很合适,怪兽应该单独设计

//作为beat方法的参数传入

protectedintmonsterLife=100;

publicvirtualvoidbeat()

}

Knife.cs

namespaceFactoryMethod

publicclassKnife:Weapon

publicoverridevoidbeat()

while(monsterLife0)

base.monsterLife-=20;

Console.WriteLine("TheMonsterisstillalive!");

Console.WriteLine("Excellent!TheMonsterisdead!");

}

Sword.cs

namespaceFactoryMethod

publicclassSword:Weapon

publicoverridevoidbeat()

while(monsterLife0)

base.monsterLife-=50;

Console.WriteLine("TheMonsterisstillalive!");

Console.WriteLine("Excellent!TheMonsterisdead!");

}

Stick.cs

namespaceFactoryMethod

publicclassStick:Weapon

publicoverridevoidbeat()

while(monsterLife0)

base.monsterLife-=100;

Console.WriteLine("TheMonsterisstillalive!");

Console.WriteLine("Excellent!TheMonsterisdead!");

}

IWeaponFactory.cs

namespaceFactoryMethod

publicinterfaceIWeaponFactory

WeaponCreateWeapon();

}

KnifeFactory.cs

namespaceFactoryMethod

publicclassKnifeFactory:IWeaponFactory

publicWeaponCreateWeapon()

returnnewKnife();

}

SwordFactory.cs

namespaceFactoryMethod

publicclassSwordFactory:IWeaponFactory

publicWeaponCreateWeapon()

returnnewSword();

}

StickFactory.cs

namespaceFactoryMethod

publicclassStickFactory:IWeaponFactory

publicWeaponCreateWeapon()

returnnewStick();

}

Program.cs

namespaceFactoryMethod

classProgram

staticvoidMain(string[]args)

IWeaponFactoryfactory=newSwordFactory();

Weaponweapon=factory.CreateWeapon();

weapon.beat();

factory=newKnifeFactory();

weapon=factory.CreateWeapon();

weapon.beat();

factory=newStickFactory();

weapon

温馨提示

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

评论

0/150

提交评论