原型模式
概念:
原型模式(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(); } }