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

    如果您认为这篇文章还不错或者有所收获,您可以通过右边的"打赏"功能 打赏我一杯咖啡【物质支持】,也可以点击左下角的【好文要顶】按钮【精神支持】,因为这两种支持都是我继续写作,分享的最大动力!

    作者: 大师兄石头
    来源: https://bigbrotherstone.cnblogs.com/
    声明: 原创博客请在转载时保留原文链接或者在文章开头加上本人博客地址,如发现错误,欢迎批评指正。凡是转载于本人的文章,不能设置打赏功能,如有特殊需求请与本人联系!

  • 相关阅读:
    Java并发编程:Lock
    java多线程中的生产者与消费者之等待唤醒机制@Version2.0
    java多线程中的生产者与消费者之等待唤醒机制@Version1.0
    vim 自动补全
    git 忽略文件的三种方式
    vim 查找整个工程
    vim 寄存器的使用
    我的vim插件列表
    web前端面试系列 一 js闭包
    web前端面试系列
  • 原文地址:https://www.cnblogs.com/BigBrotherStone/p/prototype.html
Copyright © 2011-2022 走看看