定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
类型 创建型模式
特点 通过一个对象创建另外一个对象,创建时不需要知道任何创建的细节。
举例 对象复制。
本文以C#为例,先来看类图🔻

原型模式还是比较简单的,实质就是对象自身实现一个Clone方法,如果需要创建新对象,拷贝一份原型对象即可。
模式比较简单,所以直接上代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
/// <summary>
/// 原型类
/// </summary>
abstract class Prototype
{
/// <summary>
/// 标识
/// </summary>
public string Flag { get; set; }
protected Prototype(string flag)
{
this.Flag = flag;
}
public abstract Prototype Clone();
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
/// <summary>
/// 具体的原型1
/// </summary>
class ConcretePrototype1 : Prototype
{
public ConcretePrototype1(string flag) : base(flag)
{
}
public override Prototype Clone()
{
//这里只是为了演示原型模式的原理,所以使用简单的浅复制
return (Prototype)this.MemberwiseClone();
}
}
|
客户端调用代码🔻
1
2
3
4
5
6
7
8
9
10
11
12
13
|
//创建一个对象cp1
var obj1 = new ConcretePrototype1("A");
//通过原型模式复制一个cp1的副本
var obj2 = obj1.Clone();
//展示复制结果
Console.WriteLine($"原对象标识:{obj1.Flag},新复制对象标识:{obj2.Flag}");
obj2.Flag = "B";
Console.WriteLine($"原对象标识:{obj1.Flag},新复制对象标识:{obj2.Flag}");
//程序输出:
//原对象标识:A,新复制对象标识:A
//原对象标识:A,新复制对象标识:B
|
这里特别需要注意一下,文中演示使用的this.MemberwiseClone()方法,实际上只是实现了对象的浅拷贝。至于如何实现深拷贝,这里不做实现😂😂。
浅拷贝:如果字段是值类型,则对字段进行复制,如果字段是引用类型,则复制引用本身。
深拷贝:如果字段是值类型,则对字段进行复制,如果字段是引用类型,则复制一个新对象,而不是原有被引用的对象。
参考资料:
《大话设计模式》