一、 原型(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. 新机器连接老机器遇到的ERROR

    Ansible无法连接老旧机器 报错内容: [root@BI ansible]# ansible -i /etc/ansible/hosts GameServer -m ping 10.10.113. ...

  2. 搭建Dynamic Web Project(动态web项目)的springmvc工程2

    本文转载自:http://blog.csdn.net/typa01_kk/article/details/45905129 此篇为“创建Dynamic Web Projec工程,”搭建Dynamic ...

  3. jenkins获取测试报告展示的方法

    1.写好了可以生成报告的python文件 2.在jenkins里下载 HTML Publisher plugin  插件 系统管理--管理插件--选择[可选插件]tab---搜索HTML Publis ...

  4. sublime text3 自动编译php 适合用于简单的php文件执行

    1.将php路径放入环境变量中 2. 点击 sublime_text的“工具”->"编译系统"->"编译新系统" { "cmd" ...

  5. Py修行路 python基础 (十)装饰器

    装饰器 一.定义 装饰器:顾名思义,就是对某个东西起到装饰修饰的功能. python中的装饰器,其本质上就是一个python函数,它可以让其他函数在不需要任何代码变动的前提下增加额外功能.通俗理解就是 ...

  6. linux之fstab文件详解

    /etc/fstab是用来存放文件系统的静态信息的文件.位于/etc/目录下,可以用命令less /etc/fstab 来查看,如果要修改的话,则用命令 vi /etc/fstab 来修改. 当系统启 ...

  7. java自己写的简单聊天工具SimpleQQ感悟

    Demo如下: 客户端: /* * 一个简单的QQ * 2013-8-1 * @李志杰 */ package SimpleQQ_Client; import java.awt.*; import ja ...

  8. DIV+CSS+JS实现图片<ul><li></li></ul>无缝滚动代码

    (含上下左右滚动代码) <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/ ...

  9. CBitmap Detach和DeleteObject的关系

    注意:当使用完资源后,必须通过调用函数以释放加速器表.位图.光标.图标以及菜单所占的内存资源:      加速器表:DesteoyAcceleratorTable:      位图:DeleteObj ...

  10. SQL语句 表字段的操作 添加,删除,修改表的字段

    alter table 表名 drop constraint 约束名字   //删除字段的原有约束 alter table 表名 add constraint 约束名字 DEFAULT 默认值 for ...