美文网首页
浅谈GoF23设计模式-“Prototype”模式

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

作者: 浅谈码生活 | 来源:发表于2020-08-12 14: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则是通过原型来克隆“易变对象”。

    相关文章

      网友评论

          本文标题:浅谈GoF23设计模式-“Prototype”模式

          本文链接:https://www.haomeiwen.com/subject/vqdpdktx.html