原型模式

概念:

原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。

https://www.runoob.com/design-pattern/prototype-pattern.html

实现:

1、实现克隆操作,在 JAVA 继承 Cloneable,重写 clone(),在 .NET 中可以使用 Object 类的 MemberwiseClone() 方法来实现对象的浅拷贝或通过序列化的方式来实现深拷贝。

2、原型模式同样用于隔离类对象的使用者和具体类型(易变类)之间的耦合关系,它同样要求这些"易变类"拥有稳定的接口。

涉及知识点:

1.深拷贝&浅拷贝:

深拷贝:创建一个与原对象相同的新对象(自定义构造函数,创建的对象有单独的地址)

浅拷贝:创建一个指向原对象内存的地址

2.对象的串行化: https://www.cnblogs.com/sharpel/p/5859981.html

对象的持续性:对象在程序终止时能将自身状态保存以便需要时恢复的能力

串行化:对象通过写出描述自己状态的数值来记录自己的过程

3.C#下Dictionary 与 HashTable:  (转)文为CSDN博主「凡梦_」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明   https://blog.csdn.net/mpegfour/article/details/78725768

3.1、Dictionary<K,V>在使用中是顺序存储的,而Hashtable由于使用的是哈希算法进行数据存储,是无序的。
3.2、Dictionary的key和value是泛型存储,Hashtable的key和value都是object
3.3、Dictionary是泛型存储,不需要进行类型转换,Hashtable由于使用object,在存储或者读取值时都需要进行类型转换,所以比较耗时
3.4、单线程程序中推荐使用 Dictionary, 有泛型优势, 且读取速度较快, 容量利用更充分。多线程程序中推荐使用 Hashtable, 默认的 Hashtable 允许单线程写入, 多线程读取, 对 Hashtable 进一步调用 Synchronized() 方法可以获得完全线程安全的类型. 而 Dictionary 非线程安全, 必须人为使用 lock 语句进行保护, 效率大减。
3.5、在通过代码测试的时候发现key是整数型Dictionary的效率比Hashtable快,如果key是字符串型,Dictionary的效率没有Hashtable快。

 

using System;

namespace PatternApplication.Prototype
{
    public abstract class Shape:ICloneable
    {
        private string Id;
        public string Type { get; set; }
        public void GetShapeType()
        {
        }
        public string GetId()
        {
            return Id;
        }
        public void SetId(string Id)
        {
            this.Id = Id;
        }
        public Object Clone()
        {
            return this;
        }

        public abstract void Draw();
    }

    public class Circle : Shape
    {
        public Circle() {
            Type = "Circle";
        }

        public override void Draw()
        {
            Console.WriteLine("Inside Circle::Draw()  Method."); 
        }
    }
}

  

using System.Collections;
using System.Collections.Generic;

namespace PatternApplication.Prototype
{
    public class ShapeCache
    {
        private static Dictionary<string,Shape> shapeDictionarySet = new Dictionary<string, Shape>();
        private static Hashtable shapeHashSet = new Hashtable();
        
        public Shape this[string id]
        {
            get
            {
                return GetShape(id);
            }
        }
        
        public  Shape GetShape(string shapeId)
        {
            Shape cachedShape =(Shape)shapeHashSet[shapeId];
            return (Shape)cachedShape.Clone();
        }

        public  void LoadCache()
        {
            Circle circle = new Circle();
            circle.SetId("1");
            if (shapeHashSet.Contains(circle.GetId())) return;
            shapeHashSet.Add(circle.GetId(),circle);
        }
    }
}
    static void Main(string[] args)
        {
            while (true)
            {
                Console.WriteLine("原型模式:");
                var cache = new ShapeCache();
                cache.LoadCache();
                Shape clonedShape = cache["1"];
                Console.WriteLine("Shape:"+clonedShape.GetType());

                Console.ReadLine();
            }
        }

 

posted on 2020-04-23 19:13  零一两二三  阅读(106)  评论(0编辑  收藏  举报

导航