Net设计模式实例之原型模式( Prototype Pattern)(1)

  1. 云栖社区>
  2. 博客>
  3. 正文

Net设计模式实例之原型模式( Prototype Pattern)(1)

余二五 2017-11-23 20:18:00 浏览756
展开阅读全文

一、原型模式简介(Brief Introduction

原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。
Specify the kind of objects to create using a prototypical instance, and create new objects by copying this prototype
浅复制与深复制区别:
浅复制,被复制的所有变量都还有与原来对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。
深复制,把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。
Net命名空间System提供了一个IConeable接口,此接口只有一个方法Clone(),只需要实现这个接口就可以实现原型模式(Prototype Pattern)了。

二、解决的问题(What To Solve

当一个对象生成不是通过New而是通过复制旧对象的时候,可以考虑使用原型模式。

三、原型模式分析(Analysis

1、原型模式结构

 
Prototype:原型类 Clone()方法:克隆自身的接口。
ConcretePrototypeAConcretePrototypeA:原型类的具体实现。克隆一个自身的操作。

2、代码

1、原型抽象类Prototype
/// <summary>
/// 抽象原型模式类
/// </summary>
public abstract class Prototype
{
    private string _id;
    public Prototype(string id)
    {
        this.Id = id;
    }
    public string Id
    {
        get { return _id; }
        set { _id = value; }
    }
 
    public abstract Prototype Clone();
}
 
2、具体实现类ConcretePrototypeAConcretePrototypeB
public class ConcretePrototypeA : Prototype
{
    public ConcretePrototypeA(string id)
        base(id)
    { }
    /// <summary>
    /// Returns a shallow copy 浅拷贝
    /// </summary>
    /// <returns>a shallow copy</returns>
    public override Prototype Clone()
    {
        return (Prototype)this.MemberwiseClone();
    }
}
 
public class ConcretePrototypeB:Prototype
{
    public ConcretePrototypeB(string id)
        base(id)
    { }
    /// <summary>
    /// a shallow copy
    /// </summary>
    /// <returns>浅拷贝</returns>
    public override Prototype Clone()
    {
        return (Prototype)this.MemberwiseClone();
    }
}
 
2、客户端代码
static void Main(string[] args)
{
    Prototype pA = new ConcretePrototypeA("A");
    Prototype cA = pA.Clone() as ConcretePrototypeA ;
    Console.WriteLine("Cloned:"+cA.Id);
 
    ConcretePrototypeB pB = new ConcretePrototypeB("B");
    ConcretePrototypeB cB = (ConcretePrototypeB)pB.Clone();
    Console.WriteLine("Cloned:"+cB.Id);
    Console.ReadKey();
}

3、实例运行结果










本文转自 灵动生活 51CTO博客,原文链接:http://blog.51cto.com/smartlife/263880,如需转载请自行联系原作者

网友评论

登录后评论
0/500
评论
余二五
+ 关注