zoukankan      html  css  js  c++  java
  • 设计模式:原型模式

    原型模式:PrototypePattern

     

    通过一个已经存在的对象,利用其现有的条件,克隆生成一个全新的对象,在此基础上修改部分内容,形成全新对象实体

    其实际关键点就在于一个可克隆的对象(以及深,浅克隆),通过代码可快速理解:

    namespace Core
    {
        /// <summary>
        /// 通过一个已经存在的对象,利用其现有的条件,克隆生成一个全新的对象,在此基础上修改部分内容,形成全新对象实体
        /// 1.克隆对象时对象的构造方法不执行
        /// 2.潜复制和深复制:
        ///   浅复制:Object类的clone方法只是复制本对象的原始数据类型,如int,float,string等,对于数组和对象等的引用是不会复制.
        ///   深复制:对于对象和数组进行复制行为
        /// </summary>
        public class Daylife:ICloneable//可克隆接口ICloneable
        {
            private string name;

            public string Name
            {
                get { return name; }
                set { name = value; }
            }
            public void Work()
            {
                Console.Write(this.name+"上班 ");
            }
            public void Gohome()
            {
                Console.Write(this.name+"下班 ");
             }

            
            //实现接口的克隆方法
            public object Clone()
            {
                //调用object父类的MemberwiseClone()
                return base.MemberwiseClone();
            }
        }
    }

    ICloneable接口下有一个Clone()方法,调用.Net FrameWork公共父类Object下的一个MemberwiseClone()完成子类的克隆;

    定义一个工厂(行为规范):

    namespace IFactory
    {
        using Core;
        public interface IDaylife
        {
            Daylife GetInstance();
        }
    }

    实现这个接口:

    namespace Factory
    {
        using IFactory;
        using Core;
       public  class DaylifeFactory:IDaylife
        {
           //一个静态的实例对象
           public static Daylife dl = null;
            public Core.Daylife GetInstance()
            {
                if (dl == null)
                {
                    Console.Write("new ");
                    dl=new Daylife();
                    return dl;
                }
                else
                {
                    Console.Write("clone ");
                    return (Daylife)dl.Clone();
                }
            }  
        }
    }

    Daylife类型对象必须是static,第一次获取对象时使用new创建,当第二次开始,使用原型模式的克隆.

    IDaylife fac = new DaylifeFactory();
                //第一次:创建对象
                Daylife daylife=fac.GetInstance();
                daylife.Name = "Francis";
                daylife.Work();
                daylife.Gohome();
                //部分修改:克隆
                daylife = fac.GetInstance();
                daylife.Name = "Lyfeng";
                daylife.Gohome();
                daylife.Work();

    在这里有必要继续提出一个浅,深复制的概念:

     浅复制:Object类的clone方法只是复制本对象的原始数据类型,如int,float,string等,对于数组和对象等的引用是不会复制.

     深复制:对于对象和数组进行复制行为

    为了验证,新建一个Test类

     public class Test:ICloneable
        {
            public ArrayList list = new ArrayList();
            public void set(string s)
            {
                list.Add(s);
            }
            public string get(int i)
            {
                return list[i].ToString();
            }

            public object Clone()
            {
                //浅复制
               // return base.MemberwiseClone();
                //深克隆
                Test t = (Test)base.MemberwiseClone();
                t.list = (ArrayList)list.Clone();
                return t;
            }
        }

    客户端中调用:  //验证浅复制和深复制的区别
                Test t = new Test();
                t.set("one");
                t.set("two");
                for (int i = 0; i < t.list.Count; i++)
                {
                    Console.Write("t:" + t.list[i] + " ");
                }
                Test t1 = (Test)t.Clone();
                t1.set("four");
                Console.WriteLine();
                for (int i = 0; i < t1.list.Count; i++)
                {
                    Console.Write("t1:" + t1.list[i] + " ");
                }
                Console.WriteLine();
                for (int i = 0; i < t.list.Count; i++)
                {
                    Console.Write("t:" + t.list[i] + " ");
                }

    浅克隆的方法,会改变原有的对象和数组,深克隆则不会;

    使用场合:

    1. 1.       产生对象过程比较复杂,初始化需要许多资源时
    2. 2.       希望框架原型和产生对象分开时
    3. 3.       同一个对象可能会供其他调用者同时调用访问时

     

    原型模式一般式和工厂模式一起使用,工厂复杂提供克隆对象给应用程序的调用者.

     

  • 相关阅读:
    jQuery validate 的valid()方法一直返回true
    Webstrom 使用过程中遇到的问题以及解决方案
    CSS选择符 新的认识
    前端常用正则匹配
    魔术师
    node 安装express
    为什么报错说req未定义,createServer只接受匿名函数吗?
    nodejs报错 events.js:72 throw er; // Unhandled 'error' event
    我对 javascript 闭包的理解
    ORM框架,sqlsugar学习一
  • 原文地址:https://www.cnblogs.com/Francis-YZR/p/4770958.html
Copyright © 2011-2022 走看看