zoukankan      html  css  js  c++  java
  • 原型模式

    概念:

    原型模式(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();
                }
            }
  • 相关阅读:
    PHP使用iconv函数遍历数组转换字符集
    ping localhost出现地址::1
    在 Windows 7 中禁用IPv6协议/IPv6隧道
    ping localhost 返回 ::1的导致不能打开http://localhost的原因及解决
    [LeetCode] Climbing Stairs
    [LeetCode] Binary Tree Level Order Traversal II
    [LeetCode] Set Mismatch
    [LeetCode] Power of Four
    [LeetCode] Power of Three
    [LeetCode] Power of Two
  • 原文地址:https://www.cnblogs.com/wzs2016/p/12762929.html
Copyright © 2011-2022 走看看