一、 原型(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. nginx.conf解读

    通常我们需要配置nginx.conf或者配置子项目的配置文件,那么我们需要解读它里面每一个参数的意义,就来个范例解读吧(有中午注释) #运行用户 user www-data; #启动进程,通常设置成和 ...

  2. lnmp php7 安装mysqli扩展 undefined function mysqli_connect()

    在用ci框架的时候, https://blog.csdn.net/zqtsx/article/details/8746497 https://blog.csdn.net/move_now/articl ...

  3. PhysicalDrive

    由于"\"是C/C+中转义符, "\\\\.\\"就相当于\\.\ 在Windows中 \\.\ 前缀用于标识设备,其中的"."表示本地计算 ...

  4. .net中webconfig自定义配置

    在configuration节点,也就是文件的根节点下,增加如下节点 <appSettings> <!--<add key="propPath" value ...

  5. HAProxy安装配置用于TCP的负载均衡

    HaProxy介绍 Haproxy是一个开源的高性能的反向代理或者说是负载均衡服务软件之一,它支持双机热备.虚拟主机.基于TCP和HTTP应用代理等功能.其配置简单,而且拥有很好的对服务器节点的健康检 ...

  6. FTP协议完全详解

    1. 介绍 FTP的目标是提高文件的共享性,提供非直接使用远程计算机,使存储介质对用户透明和可靠高效地传送数据.虽然我们也可以手工使用它,但是它的主要作用是供程序使用的.在阅读本文之前最好能够阅读TC ...

  7. Kata 架构

    原文:https://github.com/kata-containers/documentation/blob/master/architecture.md (欢迎纠错) Kata-runtime ...

  8. ubuntu安装composer

    1.下载composer.phar wget https://getcomposer.org/composer.phar 2.重命名composer.phar为composer mv composer ...

  9. Docker -- resolve "join node timeout" error

    在worker节点机器上通过docker swarm join 到 manger node时,报Timeout错误,如下: Error response from daemon: Timeout wa ...

  10. linux lcd设备驱动剖析二

    上一节中,分析了s3c2410fb,c的入口出口函数,以及一些重要结构体的分析,初步知道了这是一个平台驱动的架构. 上一节文章链接:http://blog.csdn.net/lwj103862095/ ...