zoukankan      html  css  js  c++  java
  • 面向对象设计模式之Prototype原型模式(创建型)

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

    可适用性:

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

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

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

    UML图解:

    示例代码:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 
     6 namespace Prototype
     7 {
     8     /***
     9      * 举例描述,假设魂斗罗游戏,其中有各种各样的角色
    10      * 比如从抽象概念上有NormalActor、FlyActor、WaterActor,其中每一种角色又
    11      * 对应A、B、C三种具体人物等等;在游戏开始需要创建若干种人物出场进行决斗
    12      * ***/
    13     public class GameSystem
    14     {
    15         NormalActor na; FlyActor fa; WaterActor wa;
    16         
    17         public void Run(NormalActor na,FlyActor fa,WaterActor wa)
    18         {
    19             //以下就是使用原型实例创建对象的种类;Clone()方法也实现了以后的多态特征
    20             NormalActor na1 = na.Clone();
    21             NormalActor na2 = na.Clone();
    22 
    23             FlyActor fa1 = fa.Clone();
    24             FlyActor fa2 = fa.Clone();
    25 
    26             WaterActor wa1 = wa.Clone();
    27             WaterActor wa2 = wa.Clone();
    28         }
    29     }
    30 
    31     //角色抽象类定义
    32     public abstract class NormalActor
    33     {
    34         public abstract NormalActor Clone();
    35     }
    36     public abstract class FlyActor
    37     {
    38         public abstract FlyActor Clone();
    39     }
    40     public abstract class WaterActor
    41     {
    42         public abstract WaterActor Clone();
    43     }
    44 
    45     /***
    46      * 注意:在C#中this.MemberwiseClone();属于浅拷贝;即当类对象执行浅拷贝时,类中引用类型
    47      * 的成员仍然是被共享的,即拷贝的是其引用成员的地址;要实现其深度拷贝有两种方法:
    48      * ①即new一个该类的实例,将当前对象的成员的值一一赋给新的对象返回此新的对象
    49      * ②使用序列化和反序列,即将当前对象序列化到内存流中,然后再将其从内存流中反序列化得到的
    50      * 一定是深度拷贝的新对象
    51      * ***/
    52 
    53 
    54     //角色类的具体实现
    55     public class NormalActorA : NormalActor
    56     {
    57 
    58         public override NormalActor Clone()
    59         {
    60             return (NormalActor)this.MemberwiseClone();
    61         }
    62     }
    63 
    64     public class FlyActorA : FlyActor
    65     {
    66 
    67         public override FlyActor Clone()
    68         {
    69             return (FlyActor)this.MemberwiseClone();
    70         }
    71     }
    72 
    73     public class WaterActorrA : WaterActor
    74     {
    75 
    76         public override WaterActor Clone()
    77         {
    78             return (WaterActor)this.MemberwiseClone();
    79         }
    80     }
    81 
    82 
    83 }

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


     

  • 相关阅读:
    Mac上的USB存储设备使用痕迹在新版操作系统有所变化
    Beware of the encrypted VM
    A barrier for Mobile Forensics
    Second Space could let suspect play two different roles easily
    Take advantage of Checkra1n to Jailbreak iDevice for App analysis
    Find out "Who" and "Where"
    Where is the clone one and how to extract it?
    Downgrade extraction on phones running Android 7/8/9
    高版本安卓手机的取证未来
    How to extract WeChat chat messages from a smartphone running Android 7.x or above
  • 原文地址:https://www.cnblogs.com/yja9010/p/3178775.html
Copyright © 2011-2022 走看看