博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unity C# 设计模式(六)原型模式
阅读量:6154 次
发布时间:2019-06-21

本文共 1641 字,大约阅读时间需要 5 分钟。

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

优点:

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方法。

转载于:https://www.cnblogs.com/Jason-c/p/8867260.html

你可能感兴趣的文章
在VMware网络测试“专用VLAN”功能
查看>>
使用Formik轻松开发更高质量的React表单(三)<Formik />解析
查看>>
也问腾讯:你把用户放在什么位置?
查看>>
CSS Sprites 样式生成工具(bg2css)
查看>>
[转]如何重构代码--重构计划
查看>>
类中如何对list泛型做访问器??
查看>>
C++解析XML--使用CMarkup类解析XML
查看>>
P2P应用层组播
查看>>
Sharepoint学习笔记—修改SharePoint的Timeouts (Execution Timeout)
查看>>
CSS引入的方式有哪些? link和@import的区别?
查看>>
Redis 介绍2——常见基本类型
查看>>
asp.net开发mysql注意事项
查看>>
(转)Cortex-M3 (NXP LPC1788)之EEPROM存储器
查看>>
ubuntu set defult jdk
查看>>
[译]ECMAScript.next:TC39 2012年9月会议总结
查看>>
【Xcode】编辑与调试
查看>>
用tar和split将文件分包压缩
查看>>
[BTS] Could not find stored procedure 'mp_sap_check_tid'
查看>>
PLSQL DBMS_DDL.ALTER_COMPILE
查看>>
Activity生命周期
查看>>