Net设计模式实例之原型模式( Prototype Pattern)
一、原型模式简介(Brief Introduction)
原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。
Specify the kind of objects to create using a prototypical instance, and create new objects by copying this prototype。
浅复制与深复制区别:
浅复制,被复制的所有变量都还有与原来对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。
深复制,把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。
Net命名空间System提供了一个IConeable接口,此接口只有一个方法Clone(),只需要实现这个接口就可以实现原型模式(Prototype Pattern)了。
二、解决的问题(What To Solve)
当一个对象生成不是通过New而是通过复制旧对象的时候,可以考虑使用原型模式。
三、原型模式分析(Analysis)
1、原型模式结构
Prototype类:原型类 Clone()方法:克隆自身的接口。
ConcretePrototypeA、ConcretePrototypeA类:原型类的具体实现。克隆一个自身的操作。
2、代码
1、原型抽象类Prototype |
/// <summary> /// 抽象原型模式类 /// </summary> public abstract class Prototype { private string _id; public Prototype(string id) { this.Id = id; } public string Id { get { return _id; } set { _id = value; } } public abstract Prototype Clone(); } |
2、具体实现类ConcretePrototypeA和ConcretePrototypeB |
public class ConcretePrototypeA : Prototype { public ConcretePrototypeA(string id) : base(id) { } /// <summary> /// Returns a shallow copy 浅拷贝 /// </summary> /// <returns>a shallow copy</returns> public override Prototype Clone() { return (Prototype)this.MemberwiseClone(); } } public class ConcretePrototypeB:Prototype { public ConcretePrototypeB(string id) : base(id) { } /// <summary> /// a shallow copy /// </summary> /// <returns>浅拷贝</returns> public override Prototype Clone() { return (Prototype)this.MemberwiseClone(); } } |
2、客户端代码 |
static void Main(string[] args) { Prototype pA = new ConcretePrototypeA("A"); Prototype cA = pA.Clone() as ConcretePrototypeA ; Console.WriteLine("Cloned:"+cA.Id); ConcretePrototypeB pB = new ConcretePrototypeB("B"); ConcretePrototypeB cB = (ConcretePrototypeB)pB.Clone(); Console.WriteLine("Cloned:"+cB.Id); Console.ReadKey(); } |
3、实例运行结果
四.原型模式实例分析(Example)
1、场景
颜色索引器存储多种颜色值,从颜色索引器中克隆客户需要几种颜色。结构如下图所示
ColorManager类:颜色索引器
ColorPrototype类:原型模式抽象类
Color类:原型模式抽象类的具体实现,Clone方法的实现,克隆自身的操作
2、代码
1、原型模式抽象类ColorPrototype及其具体实现类Color |
/// <summary> /// 原型模式抽象类 /// </summary> public abstract class ColorPrototype { public abstract ColorPrototype Clone(); } /// <summary> /// 具体实现类 /// </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; } /// <summary> /// 实现浅复制 /// </summary> /// <returns></returns> public override ColorPrototype Clone() { Console.WriteLine("Cloning color RGB: {0,3},{1,3},{2,3}", _red, _green, _blue); return this.MemberwiseClone() as ColorPrototype; } } |
3、客户端代码 |
static void Main(string[] args) { ColorManager colormanager = new ColorManager(); //初始化标准的red green blue颜色。 colormanager["red"] = new Color(255, 0, 0); colormanager["green"] = new Color(0, 255, 0); colormanager["blue"] = new Color(0, 0, 255); // 添加个性的颜色 colormanager["angry"] = new Color(255, 54, 0); colormanager["peace"] = new Color(128, 211, 128); colormanager["flame"] = new Color(211, 34, 20); // 克隆颜色 Color color1 = colormanager["red"].Clone() as Color; Color color2 = colormanager["peace"].Clone() as Color; Color color3 = colormanager["flame"].Clone() as Color; Console.ReadKey(); } |
3、实例运行结果
五、总结(Summary)
本文对原型模式(Prototype Pattern)的概念、设计结构图、代码、使用场景、深复制与浅复制的区别,以及如何Net平台下实现克隆进行了描述。以一个实例进行了说明。原型模式是比较常用和简单的设计模式。
转载自:http://www.cnblogs.com/ywqu/archive/2010/01/12/1644550.html
Net设计模式实例之原型模式( Prototype Pattern)的更多相关文章
- 设计模式系列之原型模式(Prototype Pattern)——对象的克隆
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)
原文:乐在其中设计模式(C#) - 原型模式(Prototype Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:weba ...
- 二十四种设计模式:原型模式(Prototype Pattern)
原型模式(Prototype Pattern) 介绍用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象.示例有一个Message实体类,现在要克隆它. MessageModel usin ...
- python 设计模式之原型模式 Prototype Pattern
#引入 例子1: 孙悟空拔下一嘬猴毛,轻轻一吹就会变出好多的孙悟空来. 例子2:寄个快递下面是一个邮寄快递的场景:“给我寄个快递.”顾客说.“寄往什么地方?寄给……?”你问.“和上次差不多一样,只是邮 ...
- 【UE4 设计模式】原型模式 Prototype Pattern
概述 描述 使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.如孙悟空猴毛分身.鸣人影之分身.剑光分化.无限剑制 原型模式是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象, ...
- C#设计模式——原型模式(Prototype Pattern)
一.概述 在软件开发中,经常会碰上某些对象,其创建的过程比较复杂,而且随着需求的变化,其创建过程也会发生剧烈的变化,但他们的接口却能比较稳定.对这类对象的创建,我们应该遵循依赖倒置原则,即抽象不应该依 ...
- 2.6 《硬啃设计模式》第8章 复制不是很难 - 原型模式(Prototype Pattern)
案例: 某即时战略游戏,你训练出来各种很强的战士. 为了增加游戏的可玩性,增加了一种复制魔法.实施该魔法,可以复制任意的战士. 你会怎样考虑这个设计? 在继续阅读之前,请先认真思考并写出你的设计,这样 ...
- 设计模式——原型模式(Prototype Pattern)
原型模式:用原型实例制定创建对象的种类,并且通过拷贝这些原型创建新的对象. UML 图: 原型类: package com.cnblog.clarck; /** * 原型类 * * @author c ...
- 设计模式学习心得<原型模式 Prototype >
原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式是实现了一个原型接口,该接口用于创建当 ...
随机推荐
- Linux堆溢出漏洞利用之unlink
Linux堆溢出漏洞利用之unlink 作者:走位@阿里聚安全 0 前言 之前我们深入了解了glibc malloc的运行机制(文章链接请看文末▼),下面就让我们开始真正的堆溢出漏洞利用学习吧.说实话 ...
- 循序渐进做项目系列(3):迷你QQ篇(1)——实现客户端互相聊天
<循序渐进做项目系列迷你QQ篇>将陆续介绍客户端聊天,文件传输,加好友,群聊,包括语音聊天,视频聊天,远程桌面等等需求如何实现,感兴趣的朋友可以持续关注.考虑到某些需求较为复杂,本系列采用 ...
- DRY(Don't Repeat Yourself )原则
凡是写过一些代码的程序猿都能够意识到应该避免重复的代码和逻辑.我们通过提取方法,提取抽象类等等措施来达到这一目的.我们总能时不时的听到类似这样的话:”把这些公用的类放到shared项目去,别的项目还要 ...
- Kosaraju 算法查找强连通分支
有向图 G = (V, E) 的一个强连通分支(SCC:Strongly Connected Components)是一个最大的顶点集合 C,C 是 V 的子集,对于 C 中的每一对顶点 u 和 v, ...
- 迷你MVVM框架avalon在兼容旧式IE做的努力
很多时候,写代码就像砌砖头,只要我们不关心盖楼的原因.建筑的原理.土木工程基础和工程经验,就算我们砌了100栋高楼,我们也就只是一个砌砖工人,永远也成为不了一个工程师,更别说建筑师了.而那些包工头也只 ...
- 如何在 ASP.NET MVC 中集成 AngularJS(2)
在如何在 ASP.NET MVC 中集成 AngularJS(1)中,我们介绍了 ASP.NET MVC 捆绑和压缩.应用程序版本自动刷新和工程构建等内容. 下面介绍如何在 ASP.NET MVC 中 ...
- xamarin UWP中MessageDialog与ContentDialog的区别
MessageDialog与ContentDialog的异同点解析: 相同点一:都是uwp应用上的一个弹窗控件.都能做为弹出应用. 相异点一:所在命名空间不同,MessageDialog在Window ...
- JQuery图片切换动画效果
由于博主我懒,所以页面画的比较粗糙,但是没关系,因为我主要讲的是如何实现图片动画切换. 思路:想必大家都逛过淘宝或者其他的一些网站,一般都会有图片动画切换的效果,那是怎样实现的呢?博主我呢,技术不是很 ...
- Design7:数据删除设计
在设计一个新系统的Table Schema的时候,不仅需要满足业务逻辑的复杂需求,而且需要考虑如何设计schema才能更快的更新和查询数据,减少维护成本. 模拟一个场景,有如下Table Schema ...
- SqlServer用sql对表名、字段做修改
1.重命名表 下例将表 users重命名为 userdd. EXEC sp_rename 'users', 'userdd' 2. 重命名列 下例将表 userdd中的列 sex 重命名为 s ...