原型模式描述 原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式 使用场景 如果你需要复
原型模式描述
原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式
使用场景
- 如果你需要复制一些对象, 同时又希望代码独立于这些对象所属的具体类, 可以使用原型模式。
- 如果子类的区别仅在于其对象的初始化方式, 那么你可以使用该模式来减少子类的数量。 别人创建这些子类的目的可能是为了创建特定类型的对象。
工作原理
通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它。
使用方法
1.首先定义一个抽象原型。
namespace ColoPropty.ColorProp
{
public abstract class ColorPrototype //抽象原型
{
public abstract ColorPrototype Clone(); //抽象方法
}
}
2.定义一个具体的类
namespace ColoPropty.ColorProp
{
//具体原型
class Color : ColorPrototype
{
private int red, green, blue;
public Color(int red, int green, int blue)
{
this.red = red;
this.green = green;
this.blue = blue;
}
/// <summary>
/// 重写抽象方法
/// </summary>
/// <remarks>
/// <b>MemberwiseClone</b> 方法创建一个浅拷贝,具体来说就是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。
/// </remarks>
public override ColorPrototype Clone()
{
return this.MemberwiseClone() as ColorPrototype;
}
public void Display() //在页面上显示对应的颜色
{
Console.WriteLine("RGB values are: {0},{1},{2}", //输出对应的颜色
red, green, blue);
}
}
}
3.定义管理类
namespace ColoPropty.ColorProp
{
class ColorManager
{
Hashtable colors = new Hashtable(); //定义键值对变量
public ColorPrototype this[string name] //定义原型变量
{
get { return colors[name] as ColorPrototype; }
set { colors.Add(name, value); }
}
}
}
4.实现
using System;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApp3
{
class Program
{
static void Main(string[] args)
{
ColorManager colormanager = new ColorManager();
//初始化颜色的值
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);
// 用户使用颜色
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();
Console.WriteLine("结束");
}
}
}
浅拷贝:只复制对象的基本类型、对象类型、仍然属于原引用,也称为“影子克隆”,引用地址不变;
深拷贝:不止复制对象的基本类,同时也复制原对象中的对象,说完全是就是新对象产生的,也称为“深度克隆”,引用地址变化,就是同一个对象;
我们可以根据实际情况来判断使用深拷贝还是浅拷贝