http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 4013|回复: 4

[学习心得] C#原型模式实现

[复制链接]
发表于 2019-1-4 10:24:21 | 显示全部楼层 |阅读模式
四 、Prototype Manager

原型模式的第二种形式是带原型管理器的原型模式,其 UML 图如下:

]T%`F`_YUN_UX)A`I1UGNLE.png

客户(Client)角色:客户端类向原型管理器提出创建对象的请求。

抽象原型(Prototype)角色:这是一个抽象角色,通常由一个 C#接口或抽象类实现。此角色给出所有的具体

原型类所需的接口。在 C#中,抽象原型角色通常实现了 ICloneable 接口。

具体原型(Concrete Prototype)角色:被复制的对象。此角色需要实现抽象的原型角色所要求的接口。

原型管理器(Prototype Manager)角色:创建具体原型类的对象,并记录每一个被创建的对象。

下面这个例子演示了在原型管理器中存储用户预先定义的颜色原型,客户通过原型管理器克隆颜色对象。


[C#] 纯文本查看 复制代码
/ Prototype pattern -- Real World example
using System;
using System.Collections;
// "Prototype"
abstract class ColorPrototype
{
// Methods
public abstract ColorPrototype Clone();
}
// "ConcretePrototype"
class Color : ColorPrototype
{
// Fields
private int red, green, blue;
// Constructors
public Color( int red, int green, int blue)
{
this.red = red;
this.green = green;
this.blue = blue;
}
// Methods
public override ColorPrototype Clone()
{
// Creates a 'shallow copy'
return (ColorPrototype) this.MemberwiseClone();
}
public void Display()
{
Console.WriteLine( "RGB values are: {0},{1},{2}",
red, green, blue );
}
}
// Prototype manager
class ColorManager
{
// Fields
Hashtable colors = new Hashtable();
// Indexers
public ColorPrototype this[ string name ]
{
get{ return (ColorPrototype)colors[ name ]; }
set{ colors.Add( name, value ); }
}
}
/// <summary>
/// PrototypeApp test
/// </summary>
class PrototypeApp
{
public static void Main( string[] args )
{
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 uses selected colors
string colorName = "red";
Color c1 = (Color)colormanager[ colorName ].Clone();
c1.Display();
colorName = "peace";
Color c2 = (Color)colormanager[ colorName ].Clone();
c2.Display();
colorName = "flame";
Color c3 = (Color)colormanager[ colorName ].Clone();
c3.Display();
}
}


五 、  浅拷贝与深拷贝

下面给出浅拷贝与深拷贝的两个例子,例子使用了 ICloneable 接口。C#中的数组是引用型的变量,我们通过

数组来进行演示:


[C#] 纯文本查看 复制代码
sing System;
class ShallowCopy : ICloneable
{
public int[] v = {1,2,3};
public Object Clone()
{
return this.MemberwiseClone();
}
public void Display()
{
foreach(int i in v)
Console.Write( i + ", ");
Console.WriteLine();
}
}
class Client
{
public static void Main()
{
ShallowCopy sc1 = new ShallowCopy();
ShallowCopy sc2 = (ShallowCopy)sc1.Clone();
sc1.v[0] = 9;
sc1.Display();
sc2.Display();
}
}


ShallowCopy 对象实现了一个浅拷贝,因此当对 sc1 进行克隆时,其字段 v 并没有克隆,这导致 sc1 与 sc2
的字段 v 都指向了同一个 v,因此,当修改了 sc1 的 v[0]后,sc2 的 v[0]也发生了变化。


深拷贝

[C#] 纯文本查看 复制代码
using System;
class DeepCopy : ICloneable
{
public int[] v = {1,2,3};
// 默认构造函数
public DeepCopy()
{
}
// 供 Clone 方法调用的私有构造函数
private DeepCopy(int[] v)
{
this.v = (int[])v.Clone();
}
public Object Clone()
{
// 构造一个新的 DeepCopy 对象,构造参数为
// 原有对象中使用的 v
return new DeepCopy(this.v);
}
public void Display()
{
foreach(int i in v)
Console.Write( i + ", ");
Console.WriteLine();
}
}
class Client
{
public static void Main()
{
DeepCopy dc1 = new DeepCopy();
DeepCopy dc2 = (DeepCopy)dc1.Clone();
dc1.v[0] = 9;
dc1.Display();
dc2.Display();
}
}


这次在克隆的时候,不但克隆对象本身,连里面的数组字段一并克隆。因此,最终打印出来的 dc1 与 dc2 不同。

六 、 Prototype  模式的优点与缺点

Prototype  模式的优点包括
1、Prototype 模式允许动态增加或减少产品类。由于创建产品类实例的方法是产批类内部具有的,因此增加新
产品对整个结构没有影响。

2、Prototype 模式提供了简化的创建结构。工厂方法模式常常需要有一个与产品类等级结构相同的等级结构,
而 Prototype 模式就不需要这样。

3、Portotype 模式具有给一个应用软件动态加载新功能的能力。由于 Prototype 的独立性较高,可以很容易动
态加载新功能而不影响老系统。

4、产品类不需要非得有任何事先确定的等级结构,因为 Prototype 模式适用于任何的等级结构。

Prototype  模式的缺点 :

Prototype 模式的最主要缺点就是每一个类必须配备一个克隆方法。而且这个克隆方法需要对类的功能进行通盘

考虑,这对全新的类来说不是很难,但对已有的类进行改造时,不一定是件容易的事。




1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2019-1-4 10:27:12 | 显示全部楼层
我只是路过打酱油的。
发表于 2019-1-4 11:33:02 | 显示全部楼层
强烈支持楼主ing……
发表于 2019-1-4 16:20:05 | 显示全部楼层
我只是路过打酱油的。
发表于 2019-1-5 15:46:11 | 显示全部楼层
真是难得给力的帖子啊。
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-11-22 20:08

© 2014-2021

快速回复 返回顶部 返回列表