一、 原型(Prototype)模式

  原型模式的用意是:通过给出一个原型对象来指明所要创建的对象类型,然后用复制这个原型对象的办法创建出更多的同类型对象。

从孙大圣的手段谈起

  孙悟空在与黄风怪的战斗中,"使一个身外身的手段:把毫毛揪下一把,用口嚼得粉碎,望上一喷,叫声'变',变有百十个行者,都是一样得打扮,各执一根铁棒,把那怪围在空中。"换而言之,孙悟空可以根据自己的形象,复制出很多"身外身"来。

老孙这种身外身的手段在面向对象设计领域里叫原型(Prototype)模式。

C#对原型模式的支持

  在C#里面,我们可以很容易的通过Clone()-克隆-方法实现原型模式。

二、 Prototype模式的结构:

  客户(Client)角色:客户类提出创建对象的请求。
  抽象原型(Prototype)角色:这是一个抽象角色,通常由一个C#接口或抽象类实现。此角色给出所有的具体原型类所需的接口。在C#中,抽象原型角色通常实现了ICloneable接口。
  具体原型(Concrete Prototype)角色:被复制的对象。此角色需要实现抽象原型角色所要求的接口。

 class Program
{
static void Main(string[] args)
{
// 创建两个实例和克隆
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); Console.ReadLine();
}
} //Prototype 抽象 原型
public abstract class Prototype
{
private string id;
// 构造函数
public Prototype(string id)
{
this.id = id;
}
public string Id
{
get { return id; }
}
// 方法
public abstract Prototype Clone();
} //具体原型 1
public class ConcretePrototype1 : Prototype
{
// 构造函数 base(id) 实现基类构造函数
public ConcretePrototype1(string id) : base(id) { }
// 方法
public override Prototype Clone()
{
// 浅拷贝
return (Prototype)this.MemberwiseClone();
}
} // 具体原型 2
public class ConcretePrototype2 : Prototype
{
// 构造函数
public ConcretePrototype2(string id) : base(id) { }
// 方法
public override Prototype Clone()
{
// 浅拷贝
return (Prototype)this.MemberwiseClone();
}
}

、 带Prototype Manager的原型模式

  客户(Client)角色:客户端类向原型管理器提出创建对象的请求。
  抽象原型(Prototype)角色:这是一个抽象角色,通常由一个C#接口或抽象类实现。此角色给出所有的具体原型类所需的接口。在C#中,抽象原型角色通常实现了ICloneable接口。
  具体原型(Concrete Prototype)角色:被复制的对象。此角色需要实现抽象的原型角色所要求的接口。
  原型管理器(Prototype Manager)角色:创建具体原型类的对象,并记录每一个被创建的对象。

    class Program
{
static void Main(string[] args)
{
ColorManager colormanager = new ColorManager(); // 初始化与标准颜色
colormanager["red"] = new Color(, , );
colormanager["green"] = new Color(, , );
colormanager["blue"] = new Color(, , ); // 用户添加个性化的颜色
colormanager["angry"] = new Color(, , );
colormanager["peace"] = new Color(, , );
colormanager["flame"] = new Color(, , ); // 用户使用所选的颜色
string colorName = "red";
Color color1 = (Color)colormanager[colorName].Clone();
color1.Display(); colorName = "peace";
Color color2 = (Color)colormanager[colorName].Clone();
color2.Display(); colorName = "flame";
Color color3 = (Color)colormanager[colorName].Clone();
color3.Display(); Console.ReadLine();
} } /// <summary>
/// 原型管理器 ColorManager
/// </summary>
public class ColorManager
{
Hashtable colors = new Hashtable(); // 索引器
public ColorPrototype this[string name]
{
get { return (ColorPrototype)colors[name]; }
set { colors.Add(name, value); }
} } /// <summary>
/// 颜色 抽象原型 --> ColorPrototype
/// </summary>
public abstract class ColorPrototype
{
//方法
public abstract ColorPrototype Clone();
} /// <summary>
/// 具体原型 Color
/// </summary>
public class Color : ColorPrototype
{
private int red;
private int green;
private int blue; //构造函数
public Color(int red, int green, int blue)
{
this.red = red;
this.green = green;
this.blue = blue;
} //重写基类方法
public override ColorPrototype Clone()
{
return (ColorPrototype)this.MemberwiseClone();
} public void Display()
{
Console.WriteLine("RGB values are: {0},{1},{2}", red, green, blue);
}
}

原型(Prototype)模式的更多相关文章

  1. 原型(Prototype)模式

    原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象.这就是原型模式的用意.原型模式的结构 原型模式要求对象实现一个可以“克隆 ...

  2. Java 实现原型(Prototype)模式

    public class BaseSpoon implements Cloneable {//spoon 匙, 调羹 String name; public String getName() { re ...

  3. 设计模式C++描述----08.原型(Prototype)模式

    一. 概述 定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 换句话说,就是不用重新初始化对象,而是动态地获得对象运行时的状态. 再说明白点,就是要一个拷贝过构造函数类似功能的接 ...

  4. 设计模式--原型(Prototype)模式

    写这些也许有人认为“为了模式而模式”.Insus.NET所想到的,每个大师成为大师之前,也许都得这样做. 走路,从小就开始学,直至现在,谁还不是为了走路而走路?一直重复着...... 很多人没有分享自 ...

  5. 六、原型(Prototype)模式

    原型模式是对象的创建模式,通过给出一个原型对象来指明所要创建的对象的类型.然后用复制这个原型对象的方法来创建出更多同类型的对象. 原型模式可以不用重新初始化对象,而动态的获取对象运行时的状态.使用原型 ...

  6. 克隆复制可使用原型( Prototype)设计模式

    今天有学习设计模式的原型(Prototype)<设计模式--原型(Prototype)模式>http://www.cnblogs.com/insus/p/4152773.html .为了加 ...

  7. 常见设计模式解析和实现(C++)Prototype模式(原型模式)

    作用:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. UML结构图: 抽象基类: 1)  Prototype:虚拟基类,所有原型的基类,提供Clone接口函数 接口函数: 1)  P ...

  8. Java设计模式(4)原型模式(Prototype模式)

    Prototype模式定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是: ...

  9. 类(class)、构造函数(constructor)、原型(prototype)

    类 Class 类的概念应该是面向对象语言的一个特色,但是JavaScript并不像Java,C++等高级语言那样拥有正式的类,而是多数通过构造器以及原型方式来仿造实现.在讨论构造器和原型方法前,我可 ...

  10. JS----构造函数与原型prototype 区别

    构造函数方法很好用,但是存在一个浪费内存 通过原型法分配的函数是所有对象共享的.通过原型法分配的属性是独立.-----如果你不修改属性,他们是共享 如果我们希望所有的对象使用同一一个函数,最好使用原型 ...

随机推荐

  1. Python基础-变量作用域

    1.函数作用域介绍 函数作用域 Python中函数作用域分为4种情况: L:local,局部作用域,即函数中定义的变量: E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局 ...

  2. Does Windows have a limit of 2000 threads per process?

    http://blogs.msdn.com/b/oldnewthing/archive/2005/07/29/444912.aspx Often I see people asking why the ...

  3. Unable to resolve target 'android-21'

    本文转载自:http://blog.csdn.net/love_javc_you/article/details/37728355 重新装完Ecplise+ATD+Android SDK 在Ecpli ...

  4. 【转】用Jmeter进行接口压力测试的步骤

    1.双击jmeter.bat 2.右键点击测试规划à添加àThreadsà线程组,此时在测试规划下边显露出来线程组选项.点击该选项,显露出来线程组界面.参变量线程数表达若干个烦请,参变量Ramp-Up ...

  5. 杂项-公司:星巴克百科-un

    ylbtech-杂项-公司:星巴克百科 星巴克(Starbucks)是美国一家连锁咖啡公司的名称,1971年成立,是全球最大的咖啡连锁店,其总部坐落美国华盛顿州西雅图市.星巴克旗下零售产品包括30多款 ...

  6. Build Assetbundle出错:An asset is marked as dont save, but is included in the build

    前天Build Assetbundle的时候出错了,导致打包失败,具体日志内容如下: An asset is marked as dont save, but is included in the b ...

  7. .Net 框架实现AOP(动态代理实现AOP,本文为翻译)

    在上一节,我们将静态实现AOP,但是对于一个大型项目,要想为每个类,每个方法都去实现AOP ,进行日志记录和权限验证似乎是不可能的. 即使可能对于成百上千个类维护,也是很难维护.所以今天的主题就是如标 ...

  8. js实现可拖动的布局

    思路:采用flex布局,js即时修改固定列的宽度 注意:父元素需设置position:relative:因offsetLeft和offsetTop是相对于具有定位的(position:absolute ...

  9. rpm --import /etc/pki/rpm-gpg/RPM* 有什么用?

      今天用yum安装软件,遇到了Could not open/read file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL问题,为了加深印象,特别搜索了RPM-GPG-K ...

  10. MongoDB 学习笔记(一)—— 安装入门

    注:我的环境是win7 32位. 下载安装 http://www.mongodb.org/downloads 解压即可.这里我重命名“mongodb”,存放的目录为E:\mongodb. 新建数据文件 ...