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

一、原型模式简介(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、原型模式结构

Net设计模式实例之原型模式( Prototype Pattern)(1)_第1张图片
 
Prototype :原型类 Clone() 方法 : 克隆自身的接口。
ConcretePrototypeA ConcretePrototypeA :原型类的具体实现。克隆一个自身的操作。

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 、具体实现类 ConcretePrototypeA ConcretePrototypeB
public class ConcretePrototypeA : Prototype
{
    public ConcretePrototypeA(string id)
        : base (id)
    { }
    /// <summary>
    /// Returns a sha ll ow copy 浅拷贝
    /// </summary>
    /// <returns>a sha ll ow copy</returns>
    public override Prototype Clone()
    {
        return (Prototype )this .MemberwiseClone();
    }
}
 
public class ConcretePrototypeB :Prototype
{
    public ConcretePrototypeB(string id)
        : base (id)
    { }
    /// <summary>
    /// a sha ll ow 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、实例运行结果

 

你可能感兴趣的:(原型模式,designpattern,C#设计模式,Net设计模式,原型模式实例)