一、原型模式简介(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()方法:克隆自身的接口。

ConcretePrototypeAConcretePrototypeA:原型类的具体实现。克隆一个自身的操作。

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)的更多相关文章

  1. 设计模式系列之原型模式(Prototype Pattern)——对象的克隆

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  2. 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)

    原文:乐在其中设计模式(C#) - 原型模式(Prototype Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:weba ...

  3. 二十四种设计模式:原型模式(Prototype Pattern)

    原型模式(Prototype Pattern) 介绍用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象.示例有一个Message实体类,现在要克隆它. MessageModel usin ...

  4. python 设计模式之原型模式 Prototype Pattern

    #引入 例子1: 孙悟空拔下一嘬猴毛,轻轻一吹就会变出好多的孙悟空来. 例子2:寄个快递下面是一个邮寄快递的场景:“给我寄个快递.”顾客说.“寄往什么地方?寄给……?”你问.“和上次差不多一样,只是邮 ...

  5. 【UE4 设计模式】原型模式 Prototype Pattern

    概述 描述 使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.如孙悟空猴毛分身.鸣人影之分身.剑光分化.无限剑制 原型模式是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象, ...

  6. C#设计模式——原型模式(Prototype Pattern)

    一.概述 在软件开发中,经常会碰上某些对象,其创建的过程比较复杂,而且随着需求的变化,其创建过程也会发生剧烈的变化,但他们的接口却能比较稳定.对这类对象的创建,我们应该遵循依赖倒置原则,即抽象不应该依 ...

  7. 2.6 《硬啃设计模式》第8章 复制不是很难 - 原型模式(Prototype Pattern)

    案例: 某即时战略游戏,你训练出来各种很强的战士. 为了增加游戏的可玩性,增加了一种复制魔法.实施该魔法,可以复制任意的战士. 你会怎样考虑这个设计? 在继续阅读之前,请先认真思考并写出你的设计,这样 ...

  8. 设计模式——原型模式(Prototype Pattern)

    原型模式:用原型实例制定创建对象的种类,并且通过拷贝这些原型创建新的对象. UML 图: 原型类: package com.cnblog.clarck; /** * 原型类 * * @author c ...

  9. 设计模式学习心得<原型模式 Prototype >

    原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式是实现了一个原型接口,该接口用于创建当 ...

随机推荐

  1. 使用java反射机制编写Student类并保存

    定义Student类 package org; public class Student { private String _name = null; ; ; public Student() { } ...

  2. Windows mysql提示:1045 access denied for user 'root'@'localhost' using password yes

    Windows mysql提示:1045 access denied for user 'root'@'localhost' using password yes http://blog.csdn.n ...

  3. Redis 的性能幻想与残酷现实

    2011 年,当初选择 Redis 作为主要的内存数据存储,主要吸引我的是它提供多样的基础数据结构可以很方便的实现业务需求.另一方面又比较担心它的性能是否足以支撑,毕竟当时 Redis 还属于比较新的 ...

  4. XCode的个人使用经验

    Xcode是强大的IDE(但个人觉得不如Visual Studio做得好),其强大功能无需本人再赘述,本文也不是一篇“快捷键列表”,因为XCode上的快捷键极其多,而且还有不少是需要同时按下四个按键的 ...

  5. java中文乱码解决之道(七)-----JSP页面编码过程

    我们知道JSP页面是需要转换为servlet的,在转换过程中肯定是要进行编码的.在JSP转换为servlet过程中下面一段代码起到至关重要的作用. <%@ page language=" ...

  6. 分辨率、DPI、PPI和屏幕尺寸,你都知道是啥么?

    分辨率.DPI.PPI和屏幕尺寸 分辨率 DPI/PPI 坑爹的屏幕尺寸 Reference 手机开发中不免会遇到分辨率.DPI.PPI和屏幕尺寸等术语,那就弄弄清楚这些概念的真正含义. 分辨率 分辨 ...

  7. 如何理解T-SQL中Merge语句

    写在前面的话:之前看过Merge语句,感觉没什么用,完全可以用其他的方式来替代,最近又看了看Merge语句,确实挺好用,可以少写很多代码,看起来也很紧凑,当然也有别的优点. ====正文开始===== ...

  8. windows命令——taskkill

    C:\Users\Administrator>taskkill /? TASKKILL [/S system [/U username [/P [password]]]] { [/FI filt ...

  9. Ubuntu杂记——Apache+PHP+MySQL的安装

    昨天晚上,参考博客园的另一篇文章,在自己的Ubuntu上搭建了一个Apache+PHP+MySQL的服务器,在此谨记,以备不时之需. 一.安装Apache sudo apt-get install a ...

  10. linux内核中的每cpu变量

    一.linux中的每cpu变量 看linux内核代码的时候,会发现大量的per_cpu(name, cpu),get_cpu_var(name)等出现cpu字眼的语句.从语句的意思可以看出是要使用与当 ...