原型模式
# 分类
创建型模式
# 定义
原型模式(Prototype Pattern) 是用于创建重复的对象
,同时又能保证性能
。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆,当直接创建对象的代价比较大时,则采用这种模式。
# 意图
原型模式是用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
# 应用场景
- 资源优化场景。
- 类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。
- 性能和安全要求的场景。
- 通过New产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。
- 一个对象多个修改者的场景。
- 一个对象需要提供给其它对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型拷贝多个对象供调用者使用。
- 在实际项目中,原型模式很少单独出现,一般和工厂方法模式一起出现,通过clone方法创建一个对象,然后由工厂方法提供给调用者。
# 角色与结构图
- Prototype:
抽象原型角色
定义了一个克隆产品的接口。 - ConcretePrototype:
具体原型角色
实现克隆接口,生成原型对象。 - Cilent:
客户程序角色
使用原型对象克隆新对象。
下图解释了原型模式中各角色的作用

# 示例代码
//抽象原型类
abstract class Prototype{
private string id;
public Prototype(string id) {
this.id = id;
}
public string Id{
get { return this.id; }
}
public abstract Prototype Clone();
}
//具体原型类
class ConcretePrototype1 : Prototype{
public ConcretePrototype1(string id) : base(id){}
public override Prototype Clone() {
return (Prototype)this.MemberwiseClone();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//客户端代码
class Client{
static void Main(string[] args){
ConcretePrototype1 p1 = new ConcretePrototype1("I");
ConcretePrototype1 c1 = (ConcretePrototype1)p1.Clone();
Console.WriteLine("Cloned : {0}",c1.Id);
Console.ReadLine();
}
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 优点
- 性能提高。
- 逃避构造函数的约束。
# 缺点
- 配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定容易,特别当一个类
引用不支持串行化的间接对象
,或者引用含有循环结构
的时候。
# 小结
- 一般在初始化的信息不发生变化的情况下,克隆是最好的办法,这既隐藏的对象创建的细节,又对性能是大大的提高。
- 主要解决?在运行时期建立和删除原型。
- 何时使用?
- 当一个系统应该独立于它的产品创建,构成和表示时。
- 当要实例化的类是在运行时刻指定时。
- 为了避免创建一个与产品类层次平行的工厂类层次时。
- 当一个类的实例只能有几个不同状态组合中的一种时。
- 如何解决?用用已有的一个原型对象,快速地生成和原型对象一样的实例。
- 关键代码?
- 实现克隆操作。
- 原型模式同样用于隔离类对象的使用者和具体类型之间的耦合关系,它同样要求这些‘易变类’拥有稳定的接口。
- 注意:与通过对一个类进行实例化构建新对象不同的是,原型模式是通过拷贝一个现有对象生成新对象的。浅拷贝实现 Cloneable 重写,深拷贝则是通过实现 Serializable 读取二进制流。
# 大结
依赖关系的倒置:抽象不应该依赖于实现细节,实现细节应该依赖于抽象。抽象变化的慢,抽象比较稳定,具体细节变化的快。这是设计模式的精髓。 动机:在软件系统中,经常面临着某些结构复杂的对象的创建工作,由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口。 如何应对这种变化?如何向客户程序(使用这些对象的程序)隔离出这些易变对象,从而使得依赖这些易变对象的客户程序不随着需求的改变而改变。 意图:使用原型实例制定创建对象的种类,然后通过拷贝这些原型来创建新的对象。 要点:protype模式同样用于隔离类对象的使用者和具体类型之间的耦合关系,它同样要求这些易变类拥有稳定的接口。 Protype模式对于如何创建易变类的实体对象采用原型克隆的方法来做,它使得我们可以非常灵活地动态创建拥有某些稳定接口的新对象-所需工作仅仅是注册一个新类的对象(原型),然后在任何需要的地方不断地Clone。 Prototype模式中的Clone方法可以利用net中的Object类的MemberwiseClone()方法或者序列化来实现深度拷贝。
# 一句话概括
通过复制现有的实例来创建新的实例。
编辑 (opens new window)
上次更新: 2025/03/22, 13:47:44