面向对象设计模式之Prototype原型模式(创建型)

意图:使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象

可适用性:

当要实例化的类是在运行时刻指定时,例如,通过动态装载;或者

为了避免创建一个与产品类层次平行的工厂类层次时;或者

当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。

UML图解:

 

示例代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Prototype
{
    /***
     * 举例描述,假设魂斗罗游戏,其中有各种各样的角色
     * 比如从抽象概念上有NormalActor、FlyActor、WaterActor,其中每一种角色又
     * 对应A、B、C三种具体人物等等;在游戏开始需要创建若干种人物出场进行决斗
     * ***/
    public class GameSystem
    {
        NormalActor na; FlyActor fa; WaterActor wa;
        
        public void Run(NormalActor na,FlyActor fa,WaterActor wa)
        {
            //以下就是使用原型实例创建对象的种类;Clone()方法也实现了以后的多态特征
            NormalActor na1 = na.Clone();
            NormalActor na2 = na.Clone();

            FlyActor fa1 = fa.Clone();
            FlyActor fa2 = fa.Clone();

            WaterActor wa1 = wa.Clone();
            WaterActor wa2 = wa.Clone();
        }
    }

    //角色抽象类定义
    public abstract class NormalActor
    {
        public abstract NormalActor Clone();
    }
    public abstract class FlyActor
    {
        public abstract FlyActor Clone();
    }
    public abstract class WaterActor
    {
        public abstract WaterActor Clone();
    }

    /***
     * 注意:在C#中this.MemberwiseClone();属于浅拷贝;即当类对象执行浅拷贝时,类中引用类型
     * 的成员仍然是被共享的,即拷贝的是其引用成员的地址;要实现其深度拷贝有两种方法:
     * ①即new一个该类的实例,将当前对象的成员的值一一赋给新的对象返回此新的对象
     * ②使用序列化和反序列,即将当前对象序列化到内存流中,然后再将其从内存流中反序列化得到的
     * 一定是深度拷贝的新对象
     * ***/


    //角色类的具体实现
    public class NormalActorA : NormalActor
    {

        public override NormalActor Clone()
        {
            return (NormalActor)this.MemberwiseClone();
        }
    }

    public class FlyActorA : FlyActor
    {

        public override FlyActor Clone()
        {
            return (FlyActor)this.MemberwiseClone();
        }
    }

    public class WaterActorrA : WaterActor
    {

        public override WaterActor Clone()
        {
            return (WaterActor)this.MemberwiseClone();
        }
    }


}

注:本示例代码是本人学习Webcast C#面向对象设计模式纵横谈系列讲座视频时,跟着李建忠老师一步一步的编写的,在此奉献出来,仅供大家参考


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值