Prototype原型模式

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

  • 1. 简介
  • 2. 示例
  • 3. 优缺点
    • 3.1. 优点
    • 3.2. 缺点
    • 3.3. 原型模式的适用环境

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. 需要避免使用分层次的工厂类来创建分层次的对象,并且类的实例对象只有一个或很少的几个组合状态,通过复制原型对象得到新实例可能比使用构造函数创建一个新实例更方便

来源:https://www.icode9.com/content-4-857851.html

(0)

相关推荐

  • PHP设计模式之原型模式

    PHP设计模式之原型模式 原型模式其实更形象的来说应该叫克隆模式.它主要的行为是对对象进行克隆,但是又把被克隆的对象称之为最初的原型,于是,这个模式就这样被命名了.说真的,从使用方式来看真的感觉叫克隆 ...

  • 大白话原型模式(Prototype Pattern)

    意图 原型模式是创建型设计模式,可以复制已存在的对象而无需依赖它的类. 问题 假如现在有一个对象,我们想完全复制一份新的,我们该如何做? 创建同一个类的新对象 遍历所有已存在对象的值,然后将他们的值复 ...

  • [js] 第109天 请描述下什么是原型模式?它主要运用在哪些场景?

    今日试题: 请描述下什么是原型模式?它主要运用在哪些场景? 此开源项目四大宗旨:勤思考,多动手,善总结,能坚持 <论语>,曾子曰:"吾日三省吾身"(我每天多次反省自己) ...

  • [PHP小课堂]PHP设计模式之原型模式

    [PHP小课堂]PHP设计模式之原型模式 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[DarkMatterZyCoder/149844827]免费得PHP.项目管理学习资料

  • 设计模式-原型模式

    原型模式 ​原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象,并且通过拷贝这些原型创建新的对象 ​调用者不需要知道任何创建细节,不调用构造函数 ​其属于一种创建型模式 通用类图 优点 性能 ...

  • 五分钟 掌握 原型模式 (文末送书)

    回复"000"获取程序员必备电子书 大家好,我是老田,今天我给大家分享设计模式中的原型模式.用贴切的生活故事,以及真实项目场景来讲设计模式,最后用一句话来总结这个设计模式. 关于设 ...

  • PrototypePattern原型模式

    原型模式 1.定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 Java自带一个Cloneable接口,原型类实现该接口并重写clone方法,通过调用该方法创建新的对象.这种不通过 ...

  • 创建型模式之原型模式

    定义与特点 原型(Prototype)模式的定义如下:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象. 在这里,原型实例指定了要创建的对象的种类.用这种方式创建对象 ...

  • 原型模式

    序言:今天我们来聊一下原型模式,我个人认为原型模式的命名不太好理解,称呼其为克隆模式会更妥当一点.原型模式的目的是通过复制一个现有的对象来生成一个新的对象,而不是通过实例化的方法. 原型模式的基本介绍 ...