了解原型模式

时间:2016-06-03 10:59:21

标签: design-patterns

我对原型模式有疑问。

我读到Prototype Pattern是有效的,因为它复制了对象而不是创建一个新对象,这被认为是一个昂贵的操作。

基于此,我尝试了一个样本,我看到了不同的结果。 我是以正确的方式检查还是我错过了什么?

    static void Main(string[] args)
    {
        var sw = new Stopwatch();
        sw.Start();
        Employee e;
        for (var i = 0; i < 100000; i++)
        {
            e = new Employee(5, "sandesh", 27, "Bengaluru");
            e.Print();
        }
        sw.Stop();
        Console.WriteLine("New : " + sw.ElapsedMilliseconds);

        sw.Reset();
        sw.Start();
        e = new Employee(5, "sandesh", 27, "Bengaluru");
        for (var i = 0; i < 100000; i++)
        {
            var en = e.Clone();
            en.Print();
        }
        sw.Stop();
        Console.WriteLine("Clone : " + sw.ElapsedMilliseconds);

        Console.ReadLine();
    }


public class Employee
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
    public string Place { get; set; }

    public Employee(int id, string name, int age, string place)
    {
        Id = id;
        Name = name;
        Age = age;
        Place = place;
    }


    public Employee Clone()
    {
        return (Employee)this.MemberwiseClone();
    }

    public void Print()
    {
        var sum = Id * Age;
        var full = sum + Name + Place;
    }
}

结果如下: 第一轮: - 新:18 克隆:26

第二轮: - 新:34 克隆:30

第三轮: - 新:20 克隆:33

感谢您是否可以帮助我理解这种模式。 还有什么额外的东西来创建一个新的对象,这在克隆中不会发生?

1 个答案:

答案 0 :(得分:3)

您似乎正在寻找可用于衡量对象创建与克隆对象的指标。在您的示例中,您将通过差异机制创建对象,并在度量标准中查找差异。

Prototype模式打算做的是减少对象的创建时间,而不是减少编译器和字节代码的机制,而是通过避免通常会执行的耗时操作。

例如,如果您的Employee对象需要正确实例化数据库调用,则可以使用Prototype模式来避免该调用。您仍将创建对象和设置值,如代码所示,但对象的逻辑初始化(实际数据)将被短路。这是节省时间的地方。