原型模式

1.    定义

        用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

2.      UML 类图

 

3.      结构代码

// Prototype pattern -- Structural example

using System;

 

namespace DoFactory.GangOfFour.Prototype.Structural

{

  /// <summary>

  /// MainApp startup class for Structural

  /// Prototype Design Pattern.

  /// </summary>

  class MainApp

  {

    /// <summary>

    /// Entry point into console application.

    /// </summary>

    static void Main()

    {

      // Create two instances and clone each

 

      ConcretePrototype1 p1 = new ConcretePrototype1("I");

      ConcretePrototype1 c1 = (ConcretePrototype1)p1.Clone();

      Console.WriteLine("Cloned: {0}", c1.Id);

 

      ConcretePrototype2 p2 = new ConcretePrototype2("II");

      ConcretePrototype2 c2 = (ConcretePrototype2)p2.Clone();

      Console.WriteLine("Cloned: {0}", c2.Id);

 

      // Wait for user

      Console.ReadKey();

    }

  }

 

  /// <summary>

  /// The 'Prototype' abstract class

  /// </summary>

  abstract class Prototype

  {

    private string _id;

 

    // Constructor

    public Prototype(string id)

    {

      this._id = id;

    }

 

    // Gets id

    public string Id

    {

      get { return _id; }

    }

 

    public abstract Prototype Clone();

  }

 

  /// <summary>

  /// A 'ConcretePrototype' class

  /// </summary>

  class ConcretePrototype1 : Prototype

  {

    // Constructor

    public ConcretePrototype1(string id)

      : base(id)

    {

    }

 

    // Returns a shallow copy

    public override Prototype Clone()

    {

      return (Prototype)this.MemberwiseClone();

    }

  }

 

  /// <summary>

  /// A 'ConcretePrototype' class

  /// </summary>

  class ConcretePrototype2 : Prototype

  {

    // Constructor

    public ConcretePrototype2(string id)

      : base(id)

    {

    }

 

    // Returns a shallow copy

    public override Prototype Clone()

    {

      return (Prototype)this.MemberwiseClone();

    }

  }

}


Output
Cloned: I
Cloned: II

4.      实例代码

// Prototype pattern -- Real World example

using System;

using System.Collections.Generic;

 

namespace DoFactory.GangOfFour.Prototype.RealWorld

{

  /// <summary>

  /// MainApp startup class for Real-World

  /// Prototype Design Pattern.

  /// </summary>

  class MainApp

  {

    /// <summary>

    /// Entry point into console application.

    /// </summary>

    static void Main()

    {

      ColorManager colormanager = new ColorManager();

 

      // Initialize with standard colors

      colormanager["red"] = new Color(255, 0, 0);

      colormanager["green"] = new Color(0, 255, 0);

      colormanager["blue"] = new Color(0, 0, 255);

 

      // User adds personalized colors

      colormanager["angry"] = new Color(255, 54, 0);

      colormanager["peace"] = new Color(128, 211, 128);

      colormanager["flame"] = new Color(211, 34, 20);

 

      // User clones selected colors

      Color color1 = colormanager["red"].Clone() as Color;

      Color color2 = colormanager["peace"].Clone() as Color;

      Color color3 = colormanager["flame"].Clone() as Color;

 

      // Wait for user

      Console.ReadKey();

    }

  }

 

  /// <summary>

  /// The 'Prototype' abstract class

  /// </summary>

  abstract class ColorPrototype

  {

    public abstract ColorPrototype Clone();

  }

 

  /// <summary>

  /// The 'ConcretePrototype' class

  /// </summary>

  class Color : ColorPrototype

  {

    private int _red;

    private int _green;

    private int _blue;

 

    // Constructor

    public Color(int red, int green, int blue)

    {

      this._red = red;

      this._green = green;

      this._blue = blue;

    }

 

    // Create a shallow copy

    public override ColorPrototype Clone()

    {

      Console.WriteLine(

        "Cloning color RGB: {0,3},{1,3},{2,3}",

        _red, _green, _blue);

 

      return this.MemberwiseClone() as ColorPrototype;

    }

  }

 

  /// <summary>

  /// Prototype manager

  /// </summary>

  class ColorManager

  {

    private Dictionary<string, ColorPrototype> _colors =

      new Dictionary<string, ColorPrototype>();

 

    // Indexer

    public ColorPrototype this[string key]

    {

      get { return _colors[key]; }

      set { _colors.Add(key, value); }

    }

  }

}


Output
Cloning color RGB: 255,  0,  0
Cloning color RGB: 128,211,128
Cloning color RGB: 211, 34, 20

该文章来自:http://www.dofactory.com/Patterns/PatternPrototype.aspx

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值