意图
用原型示例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
----《设计模式》GOF
适用性
当一个系统应该独立于它的产品创建,构成和表示时,要使用Prototype模式;以及
- 当要实例化的类在运行时刻指定时,例如通过动态装载
- 为了避免创建一个与产品类层次平行的工厂类层次时
- 当一个类的实例只能由几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化更方便;
结构
参与者
- Prototype
- 声明一个克隆自身的接口
- ConcretePrototype
- 实现一个自身克隆自身的操作
- Client
- 让一个原型克隆自身从而创建一个新的对象
协作
- 客户请求一个原型克隆自身
效果
- 运行时刻增加和删除产品
- 改变值以指定新对象
- 改变结构以指定新对象
- 减少子类的创建
- 用类动态配置应用
实现
- 使用一个原型管理器
- 实现克隆操作
- 初始化克隆对象
代码示例
class PrototypeStructure
{
public void Test()
{
Prototype p = new ConcretePrototype("11");
Prototype p2 = (ConcretePrototype)p.Clone();
Console.WriteLine(p.GetType().Name+"---Id--"+p.ID);
Console.WriteLine(p2.GetType().Name + "---Id--" + p2.ID);
}
}
abstract class Prototype
{
private string _id = "0";
public Prototype(string id)
{
this._id = id;
}
public abstract Prototype Clone();
public String ID {
get { return this._id; }
}
}
class ConcretePrototype : Prototype
{
private string _id = "1";
public ConcretePrototype(string id):base(id)
{
}
public override Prototype Clone()
{
return (Prototype)this.MemberwiseClone();
}
}
结果:
ConcretePrototype-- - Id--11
ConcretePrototype-- - Id--11
如有问题,欢迎斧正!!!