zoukankan      html  css  js  c++  java
  • Unity C# 设计模式(六)原型模式

    定义:用原型实例指定创建对象的种类,并通过拷贝这些原型来创建新的对象。

    优点:

    1、原型模式向客户隐藏了创建新实例的复杂性

    2、原型模式允许动态增加或较少产品类。

    3、原型模式简化了实例的创建结构,工厂方法模式需要有一个与产品类等级结构相同的等级结构,而原型模式不需要这样。

    4、产品类不需要事先确定产品的等级结构,因为原型模式适用于任何的等级结构

    缺点:

    1、每个类必须配备一个克隆方法

    2、 配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。

    示例代码

    /*
    原型模式:Prototype这里简写为P,用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象
    
    抽象原型:Prototype_P 类,
    具体原型:Ferrari_P 类
    
    */
    public abstract class Prototype_P {
        private string id;
        public string Id
        {
            get { return id;}
            private set{ id = value; }
        }
    
        public Prototype_P(string _id)
        {
            this.Id = _id;
            UnityEngine.Debug.Log ("new");//运行可知,得到多个对象,只需被new了一次
        }
    
        public abstract Prototype_P Clone();
    
    }
    public class Ferrari_P : Prototype_P {
    
        public Ferrari_P (string _id):base(_id){}
    
        public override Prototype_P Clone ()
        {
            return (Prototype_P)this.MemberwiseClone ();
        }
    }
    using UnityEngine;
    
    public class Client_P : MonoBehaviour {
    
        void Start(){
            Prototype_P carPrototype=new Ferrari_P("法拉利");
    
            Prototype_P FerrariClone_1 = carPrototype.Clone ()as Ferrari_P;
            Debug.Log (FerrariClone_1.Id);
    
            Prototype_P FerrariClone_2 = carPrototype.Clone ()as Ferrari_P;
            Debug.Log (FerrariClone_2.Id);
    
            Prototype_P FerrariClone_3 = carPrototype.Clone ()as Ferrari_P;
            Debug.Log (FerrariClone_3.Id);
    
            Prototype_P FerrariClone_4 = carPrototype.Clone ()as Ferrari_P;
            Debug.Log (FerrariClone_4.Id);
    
        }
    }

    在.NET中可以很容易地通过实现ICloneable接口(这个接口就是原型,提供克隆方法,相当于与上面代码中 Prototype_P 抽象类)中Clone()方法来实现原型模式,

    如果我们想我们自定义的类具有克隆的功能,首先定义类继承与ICloneable接口并实现Clone方法。

  • 相关阅读:
    java 继承(下)
    java继承
    java代码封装与编译
    使用Access-Control-Allow-Origin解决跨域
    java (基本语法)
    ZendStudio如何汉化
    如何让数据库在每天的某一个时刻自动执行某一个存储过程或者某一个sql语句
    百度地图不用密匙也可以使用
    .net在当前日期的基础上加一天
    当你的IIS需要运行ASP网站时,需要这样配置下你的IIS
  • 原文地址:https://www.cnblogs.com/Jason-c/p/8867260.html
Copyright © 2011-2022 走看看