设计模式笔记(6)---原型模式(创建型)
2012-05-25 14:35
351 查看
Gof定义
使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。动机
在软件系统中,经常面临着“某些结构复杂的对象”的创建工作,但由于需求的变化,这些对象将成面临着剧烈的变化,但他们拥有比较稳定一致的接口。假设在一些打斗游戏场景中,有这样一些角色,普通(NormalActor),可以飞的(FlyActor),可以潜水的(WaterActor)
publicabstractclassNormalActor{} publicabstractclassFlyActor{} publicabstractclassWaterActor{}
上面的三个类都是抽象类,自然会有具体的类来继承这些抽象类
publicclassNormalActorA:NormalActor{} publicclassFlyActorA:FlyActor{} publicclassWaterActorA:WaterActor{}
在游戏运行中就会去使用这些角色的具体类,如下
publicclassGameSystem { publicvoidRun() { NormalActorAnormalActor1=newNormalActorA(); NormalActorAnormalActor2=newNormalActorA(); NormalActorAnormalActor3=newNormalActorA(); NormalActorAnormalActor4=newNormalActorA(); NormalActorAnormalActor5=newNormalActorA(); FlyActorAflyActor1=newFlyActorA(); FlyActorAflyActor2=newFlyActorA(); WaterActorAwaterActor1=newWaterActorA(); WaterActorAwaterActor2=newWaterActorA(); } }
在GameSystem类中,我们直接使用具体类(NormalActorA)等来创建对象,GameSystem就对这些具体类产生了依赖,在DIP(依赖倒置原则)中讲到抽象不应依赖具体实现,具体实现应依赖于抽象,所以GameSystem中的代码要进行如下改动
publicclassGameSystem
{
publicvoidRun(NormalActornormalActor,FlyActorflyActor,
WaterActorwaterActor)
{
NormalActornormalActor1=normalActor.Clone();
NormalActornormalActor2=normalActor.Clone();
NormalActornormalActor3=normalActor.Clone();
NormalActornormalActor4=normalActor.Clone();
NormalActornormalActor5=normalActor.Clone();
FlyActorflyActor1=flyActor.Clone();
FlyActorflyActor2=flyActor.Clone();
WaterActorwaterActor1=waterActor.Clone();
WaterActorwaterActor2=waterActor.Clone();
}
}
经过修改在GameSystem类中已经看不到具体类的影子了,创建对象是通过传入的抽象类类型的参数的Clone方法来创建,关于Clone方法在后面讲到,这样GameSystem就只依赖于抽象了。
下面来说说Clone方法了,首先在抽象类中定义Clone方法
publicabstractclassNormalActor
{
publicabstractNormalActorClone();
}
publicabstractclassFlyActor
{
publicabstractFlyActorClone();
}
publicabstractclassWaterActor
{
publicabstractWaterActorClone();
}
然后在具体类中来实现Clone,使用
publicclassNormalActorA:NormalActor
{
publicoverrideNormalActorClone()
{
return(NormalActor)this.MemberwiseClone();
}
}
publicclassFlyActorA:FlyActor
{
publicoverrideFlyActorClone()
{
return(FlyActor)this.MemberwiseClone();
}
}
publicclassWaterActorA:WaterActor
{
publicoverrideWaterActorClone()
{
return(WaterActor)this.MemberwiseClone();
}
}
至此,原型模式的代码结构基本完成,下面看看在程序中试怎么来调用的
publicclassApp
{
publicstaticvoidMain()
{
GameSystemgameSystem=newGameSystem();
gameSystem.Run(newNormalActorA(),newFlyActorA(),newWaterActorA());
}
}
原型模式(Prototype)的几个要点
Prototype模式同样用于隔离类对象的使用者和具体类型(易变类型)之间的耦合关系,同样要求这些易变类型具有稳定的接口。Prototype模式对于“如何创建易变类的实体对象”采用原型克隆的方法来做,他使得我们可以非常灵活的动态创建“拥有某些稳定接口”的新对象--所需工作仅仅是注册一个新类的对象(原型),然后在任何需要的地方不断地Clone。
Prototype模式中的克隆方法可以利用Net中的Object类的MemberwiseClone方法或是序列化来实现深拷贝。
作者:
出处:
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
相关文章推荐
- 设计模式笔记--创建型模式之四--原型prototype
- 设计模式笔记 5.Prototype 原型模式(创建型模式)
- 设计模式笔记(6)---原型模式(创建型)
- 设计模式笔记(6)---原型模式(创建型)
- 设计模式笔记(6)---原型模式(创建型)
- C#面向对象设计模式学习笔记(5) - Prototype 原型模式(创建型模式)
- [设计模式笔记]一. 创建型模式--5.Prototype模式(原型)(一)
- [设计模式笔记]一. 创建型模式--5.Prototype模式(原型)(二)
- 【设计模式学习笔记五】【创建型模式】【原型模式(Prototype)】
- 设计模式学习笔记——创建型模式
- 设计模式笔记--创建型模式之五--单件 Singleton
- 设计模式复习笔记 (4)创建型模式:抽象工厂模式
- 设计模式学习笔记--原型模式
- 23种设计模式(5)_创建型_原型模式(Prototype Pattern)
- 创建型设计-原型模式
- JAVA设计模式(5) —<创建型>原型模式(Prototype)
- 设计模式学习笔记(六)——Prototype原型模式
- 设计模式五:Prototype原型模式——对象创建型模式
- (5)设计模式笔记[原型模式]
- java设计模式笔记之原型模式