您的位置: 旅游网 > 网红

无废话C#设计模式之五:Prototype

发布时间:2019-09-13 19:11:56

本系列文章将向大家介绍一下C#的设计模式,此为第五篇文章,相信对大家会有所帮助的。废话不多说,继续来看。  意图

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

场景

游戏场景中的有很多相似的敌人,它们的技能都一样,但是随着敌人出现的位置不同,这些人的能力不太一样。假设,我们现在需要把三个步兵组成一队,其中还有一个精英步兵,能力特别高。那么,你或许可以创建一个敌人抽象类,然后对于不同能力的步兵创建不同的子类。然后,使用工厂方法等设计模式让调用方依赖敌人抽象类。

问题来了,如果有无数种能力不同步兵,难道需要创建无数子类吗?还有,步兵模型的初始化工作是非常耗时的,创建这么多步兵对象可能还会浪费很多时间。我们是不是可以通过只创建一个步兵原型,然后复制出多个一摸一样的步兵呢?复制后,只需要调整一下这些对象在地图上出现的位置,或者调整一下它们的能力即可。原型模式就是用来解决这个问题的。

示例代码

以下是引用片段:

usingSystem;

usingSystem.Threading;

usingSystem.Collections.Generic;

usingSystem.IO;

usingSystem.Runtime.Serialization.Formatters.Binary;

usingSystem.Diagnostics;

namespacePrototypeExample

{

classProgram

{

staticvoidMain(string[]args)

{

Stopwatchsw=newStopwatch();

sw.Start();

EnemyenemyPrototype=newFootMan(5,4,newLocation(100,200));

GameScenegs=newGameScene();

ListenemyGroup=gs.CreateEnemyGroup(enemyPrototype);

foreach(FootManftinenemyGroup)

{

ft.ShowInfo();

ft.FootmanAttack();

}

Console.WriteLine(sw.ElapsedMilliseconds);

}

}

classGameScene

{

publicListCreateEnemyGroup(EnemyenemyPrototype)

{

ListenemyGroup=newList();

Enemye1=enemyPrototype.Clone(true);

e1.Location.x=enemyPrototype.Location.x-10;

Enemye2=enemyPrototype.Clone(true);

e2.Location.x=enemyPrototype.Location.x+10;

Enemyelite=enemyPrototype.Clone(true);

elite.Power=enemyPrototype.Power*2;

elite.Speed=enemyPrototype.Speed*2;

elite.Location.x=enemyPrototype.Location.x;

elite.Location.y=enemyPrototype.Location.y+10;

enemyGroup.Add(e1);

enemyGroup.Add(e2);

enemyGroup.Add(elite);

returnenemyGroup;

}

}

[Serializable]

classLocation

{

publicintx;

publicinty;

publicLocation(intx,inty)

{

this.x=x;

this.y=y;

}

}

[Serializable]

abstractclassEnemy

{

protectedLocationlocation;

publicLocationLocation

{

get{returnlocation;}

set{location=value;}

}

protectedintpower;

publicintPower

{

get{returnpower;}

set{power=value;}

}

protectedintspeed;

publicintSpeed

{

get{returnspeed;}

set{speed=value;}

}

publicabstractEnemyClone(boolisDeepCopy);

publicabstractvoidShowInfo();

publicEnemy(intpower,intspeed,Locationlocation)

{

Thread.Sleep(1000);//Constructmethodisassumedtobeahighcalcwork.

this.power=power;

this.speed=speed;

this.location=location;

}

}

[Serializable]

classFootMan:Enemy

{

privatestringmodel;

publicFootMan(intpower,intspeed,Locationlocation)

:base(power,speed,location)

{

model="footman";

}

publicoverridevoidShowInfo()

{

Console.WriteLine("model:{0}power:{1}speed:{2}location:({3},{4})",model,power,speed,location.x,location.y);

}

publicoverrideEnemyClone(boolisDeepCopy)

{

FootManfootman;

if(isDeepCopy)

{

MemoryStreammemoryStream=newMemoryStream();

BinaryFormatterformatter=newBinaryFormatter();

formatter.Serialize(memoryStream,this);

memoryStream.Position=0;

footman=(FootMan)formatter.Deserialize(memoryStream);

}

else

footman=(FootMan)this.MemberwiseClone();

returnfootman;

}

publicvoidFootmanAttack()

{

Console.WriteLine("FootmanAttack");

}

}

}

小儿食积
夜尿增多怎么调理
幼儿流鼻血是什么原因
热淋清颗粒能治尿路感染吗
猜你会喜欢的
猜你会喜欢的