谈谈设计模式~原型模式(Prototype)

返回目录

原型模式是创建型模式的一种,其特点在于通过“复制”一个已经存在的实例来返回新的实例(clone),而不是新建(new)实例。被复制的实例就是我们所称的“原型”,这个原型是可定制的。

原型模式多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效;或者创建值相等,只是命名不一样的同类数据。

从原型模式的概念中,我们可以看到,在这个模式里,拷贝是个很重要的概念,即在不创建对象的情况下,返回一个已有对象,这就是拷贝去实现的,在面向对象的编程世界里,拷贝分为浅拷贝和深拷贝,如果希望对两者有更深入的认识,

可以阅读我的这篇文章《不忘本~浅拷贝和深拷贝》。

何时能用到它?

当你一个大对象被创建后,它可以在程序里被使用多次,而使用的时候可能有些属性值会发生变化,这里,你不需要重新去new这个对象,而可以使用原型模式去克隆这个对象,这样,可以提交程序的性能。

策略模式的结构图

 

策略模式实现说明

CarPrototype:抽象原型,定义一个克隆的方法,返回规定的原型

ConcteteCarPrototype:具体原型,实现了抽象原来的克隆,并返回了这类抽象原型,在具体原型中,还提供了某体的属性和方法等

CarManagerL:原型管理器,这个管理员用于被前台(UI)去调用,它用来存储原型集合

策略模式的C#实现

复制代码
#region 原型模式
    abstract class CarPrototype
    {
        public abstract CarPrototype Clone();
    }

    class ConcteteCarPrototype : CarPrototype
    {
        private string _body, _color, _wheal;
        public ConcteteCarPrototype(string body, string color, string wheal)
        {
            this._body = body;
            this._color = color;
            this._wheal = wheal;
        }
        public override CarPrototype Clone()
        {
            //实现浅表拷贝
            return (CarPrototype)this.MemberwiseClone();
        }
        public void Display(string _carName)
        {
            Console.WriteLine("{0}'s Cart Values are: {1},{2},{3}",
                _carName, _body, _color, _wheal);
        }
    }

    class CarManager
    {
        Hashtable colors = new Hashtable();
        public CarPrototype this[string name]
        {
            get
            {
                return (CarPrototype)colors[name];
            }
            set
            {
                colors.Add(name, value);
            }
        }
    }


    #endregion
复制代码

调用代码

复制代码
 CarManager colormanager = new CarManager();

            //初始化
            colormanager["奥迪"] = new ConcteteCarPrototype("德国", "黑色", "四轮驱动");
            colormanager["奇端"] = new ConcteteCarPrototype("中国", "白色", "前轮驱动");

            //调用

            ConcteteCarPrototype c1 = (ConcteteCarPrototype)colormanager["奇端"].Clone();
            c1.Display("奇端");

            Console.ReadLine();
复制代码

结果截图

 

返回目录

posted @   张占岭  阅读(1180)  评论(0编辑  收藏  举报
编辑推荐:
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
历史上的今天:
2012-08-08 将不确定变为确定~真的是SqlDataReader引起的超时?
点击右上角即可分享
微信分享提示