博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一起谈.NET技术,.Net Framework源代码中的模式之Prototype(原型模式)
阅读量:6409 次
发布时间:2019-06-23

本文共 2194 字,大约阅读时间需要 7 分钟。

  用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。

Prototype(原型模式)

  以.NET Framework 2.0 System.Collections中类为例。

System.Collections  System.Collections. ICollection

 
public
interface
ICollection : IEnumerable
{
}

  System.Collections. ICloneable 

 
public
interface
ICloneable
{
  object
Clone();
}

  System.Collections. Stack

public
class Stack : ICollection, ICloneable
{
  
public
virtual Object Clone()
  {
    Stack s
=
new Stack(_size);
    s._size
= _size;
    Array.Copy(_array,
0
, s._array,
0, _size);
    s._version
= _version;
    
return s;
  }
}

  System.Collections. Queue

 
public
class
Queue : ICollection, ICloneable
{
  public
virtual
Object Clone()
  {
   Queue q
=
new
Queue(_size);
   q._size
=
_size;
   
int
numToCopy
=
_size;
   
int
firstPart
=
(_array.Length
-
_head
<
numToCopy)
?
_array.Length
-
_head : numToCopy;
   Array.Copy(_array, _head, q._array,
0
, firstPart);
   numToCopy
-=
firstPart;
   
if
(numToCopy
>
0
)
   Array.Copy(_array,
0
, q._array, _array.Length
-
_head, numToCopy);
   q._version
=
_version;
   
return
q;
  }
}

  调用代码

public
class Client
{
  public
static
void Main()
  {
    Stack myStack
=
new Stack();
    myStack.Push(
"
Hello
");
    myStack.Push(
"
World
");
    myStack.Push(
"
!
");
    Stack myStackCopy
= (Stack)myStack.Clone();
 
    
foreach
(
string
s
in myStackCopy)
    {
      Console.Write(s);
    }
    Console.WriteLine();
    Console.ReadLine();
  }
}

  在.NET Framework中,可以通过实现ICloneable接口来实现原型模式,ICloneable接口只有一个Clone方法。克隆的实现方法有两种:浅拷贝(shallow copy)与深拷贝(deep copy)。

  浅拷贝是指当对象的字段值被拷贝时,字段引用的对象不会被拷贝。例如,如果一个对象有一个指向字符串的字段,并且我们对该对象做了一个浅拷贝,那么两个对象将引用同一个字符串。而深拷贝是对对象实例中字段引用的对象也进行拷贝的一种方式,所以如果一个对象有一个指向字符串的字段,并且我们对该对象做了一个深拷贝的话,我们将创建一个新的对象和一个新的字符串--新对象将引用新字符串。需要注意的是执行深拷贝后,原来的对象和新创建的对象不会共享任何东西;改变一个对象对另外一个对象没有任何影响。

  对于值类型,浅拷贝通过赋值等操作直接实现,将对象中的值类型的字段拷贝到新的对象中;深拷贝和浅拷贝相同,通过赋值等操作直接实现,将对象中的值类型的字段拷贝到新的对象中。 对于引用类型,浅拷贝通过MemberwiseClone 方法创建一个浅副本,方法是创建一个新对象,如果字段是值类型的,则对该字段执行逐位复制,如果字段是引用类型,则复制引用原始对象,与原对象引用同一对象;深拷贝拷贝对象应用,也拷贝对象实际内容,也就是创建了一个新的对象,改变新对象不会影响到原始对象的内容。

  在下列情况下,应当使用Prototype模式:

  • 当一个系统应该独立于它的产品创建,构成和表示时;
  • 当要实例化的类是在运行时刻指定时,例如,通过动态装载;
  • 为了避免创建一个与产品类层次平行的工厂类层次时;
  • 当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。

转载于:https://www.cnblogs.com/waw/archive/2011/08/29/2158707.html

你可能感兴趣的文章
Vue 基础篇
查看>>
JavaScript:函数防抖与函数节流
查看>>
关于区间贪心的补全
查看>>
架构设计步骤
查看>>
自定义元素探秘及构建可复用组件最佳实践
查看>>
区块链是一个公共数据库,要放在一个块内
查看>>
小程序开发注意事项
查看>>
ECMAScript7规范中的instanceof操作符
查看>>
Hadoop HDFS原理分析
查看>>
【webpack4】基本配置和入门api
查看>>
Mac使用ssh公钥登录Linux
查看>>
【366天】跃迁之路——程序员高效学习方法论探索系列(实验阶段124-2018.02.06)...
查看>>
POJ3070-Fibonacci(矩阵快速幂)
查看>>
[vue插件]基于vue2.x的电商图片放大镜插件
查看>>
标准的组件结构
查看>>
vue——一个页面实现音乐播放器
查看>>
NET Core-学习笔记(二)
查看>>
职业生涯上的点点滴滴
查看>>
一起来将vscode变成私人定制笔记本
查看>>
Flutter 云音乐
查看>>