Prototype原型模式

>>返回《C#常用设计模式》

1. 简介

  • 定义
    • 使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象。
  • 使用场景
    • 频繁创建“结构复杂的对象”
  • 注意,克隆的对象是全新的对象,而且是独立

2. 示例

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

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            GameSys sys = new GameSys();
            sys.Run(new NormalActorA(), new FlyActorA(), new WaterActorA());
        }
    }

    public class GameSys
    {
        public void Run(NormalActor normalActor, FlyActor flyActor, WaterActor waterActor)
        {
            NormalActor nActor1 = normalActor.Clone();
            NormalActor nActor2 = normalActor.Clone();
            NormalActor nActor3 = normalActor.Clone();

            FlyActor fActor1 = flyActor.Clone();
            FlyActor fActor2 = flyActor.Clone();
            WaterActor wActor1 = waterActor.Clone();
        }
    }
    #region 抽象类

    public abstract class NormalActor
    {
        public abstract NormalActor Clone();
    }
    public abstract class FlyActor
    {
        public abstract FlyActor Clone();
    }
    public abstract class WaterActor
    {
        public abstract WaterActor Clone();
    }
    #endregion

    #region 具体实现

    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 WaterActorA : WaterActor
    {
        public override WaterActor Clone()
        {
            return (WaterActor)this.MemberwiseClone();
        }
    }

    #endregion
}

3. 优缺点

3.1. 优点

  1. 简化对象的创建过程,通过复制一个已有对象实例可以提高新实例的创建效率
  2. 扩展性好
  3. 提供了简化的创建结构,原型模式中的产品的复制是通过封装在原型类中的克隆方法实现的,无需专门的工厂类来创建产品
  4. 可以通过深克隆的方式保存对象的状态,使用原型模式将对象复制一份并其状态保存起来,以便在需要的时候使用,可辅助实现撤销操作

3.2. 缺点

  1. 需要为每一个类准备一个克隆方法,而且该克隆方法位于一个类的内部,当对已有类进行改造时,需要修改原代码,违背了开闭原则
  2. 在实现深克隆时需要写较复杂的代码,而且当对象之间存在多重的嵌套引用时,为了实现深克隆,每一层对象对应的类必须支持深克隆,实现起来较繁琐

3.3. 原型模式的适用环境

  1. 创建新对象成本较大,新对象可以通过复制已有对象来获得,如果是相似对象,则可以对其成员变量修改
  2. 系统要保存对象的状态,而对象的状态变化很小
  3. 需要避免使用分层次的工厂类来创建分层次的对象,并且类的实例对象只有一个或很少的几个组合状态,通过复制原型对象得到新实例可能比使用构造函数创建一个新实例更方便
posted @ 2021-02-15 10:26  大师兄石头  阅读(203)  评论(0编辑  收藏  举报