浅谈GoF23设计模式-“Prototype”模式

2020-08-12  本文已影响0人  浅谈码生活

“Prototype”模式,原型模式是继“Singleton”,“AbstractFactory”,“Builder”,“FactoryMethod”后的最后一种创建型模式。

"Prototype"模式定义:使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。

在聊"Prototype"模式之前,还是想先介绍一下“拷贝”。

Clone:分为“浅拷贝”和深拷贝。

  浅拷贝对于值类型和String类型成员拷贝时会在副本中重新创建成员,对于引用类型,对象和副本对象引用同一个内存地址,当在对象或者副本对象修改引用成员后,引用类型的成员就发生变化。(浅拷贝可以使用object下的MemberwiseClone())

  深拷贝不管是值类型还是引用类型,对象和副本对象修改成员属性都只会改变各自对象的值,两个对象是完全独立的实体(深拷贝实现的四种方法)

“Prototype”模式应用场景:在软件系统中,经常面临着“某种结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但时他们却拥有比较稳定的接口。

“Prototype”模式要点:

1.)“Prototype”模式同样用于隔离类对象的使用者和具体类型之间的耦合关系,它同样要求这些“易变类”拥有稳定的接口。

2.)“Prototype”模式对于“如何创建易变类的实体对象”采用“原型克隆”的方法来做,它使得我们可以非常灵活的动态创建“拥有某些稳定接口”的新对象——所需工作仅仅是注册一个新类的对象,然后在任何需要的地方不断Clone。

3.)上边提到过的“浅拷贝”和“深拷贝”。

简单演示:

//按游戏中的兵种进行抽象,普通兵,飞行兵,水上兵

public abstract class NormalActor{

public abstract NormalActor Clone();

}

public abstract class FlyActor{

public abstract FlyActor Clone();

}

public abstract class WaterActor{

public abstract WaterActor Clone();

}

//继承NormalActor,FlyActor,WaterActor抽象类,根据对象中“成员类型”并且实现具体细节

//假设兵种对象的成员都是“值类型”和“string”类型,以浅拷贝为例

public class NormalActorA : NormalActor{

public override NormalActor Clone(){

return (NormalActorA)this.MemberwiseClone();

}}

public class FlyActorA : FlyActor{

public override FlyActor Clone(){

return (FlyActorA)this.MemberwiseClone();

}}

public class WaterActorA : WaterActor{

public override WaterActor Clone(){

return (WaterActorA)this.MemberwiseClone();

}}

//具体使用

public class GameSystem{

public void Run(NormalActorA normalActorA){

NormalActorA a1 = (NormalActorA)normalActorA.Clone();

NormalActorA a2 = (NormalActorA)normalActorA.Clone();

}}

以上就是“Prototype”模式的简单演示,到这里创建型的设计模式就差不多了,我们来讨论一下这几种创建型设计模式:

Singleton模式解决的是实体对象个数的问题。除了Singleton之外,其他创建型模式解决的都是new所带来的耦合关系。

FactoryMethod。AbstractFactory,Builder都需要一个额外的工厂类来负责实例化“易变对象”,而Prototype则是通过原型来克隆“易变对象”。

上一篇下一篇

猜你喜欢

热点阅读