原型模式

# 分类

创建型模式

# 定义

原型模式(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
//客户端代码
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

# 优点

  • 性能提高。
  • 逃避构造函数的约束。

# 缺点

  • 配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。

# 小结

  • 一般在初始化的信息不发生变化的情况下,克隆是最好的办法,这既隐藏的对象创建的细节,又对性能是大大的提高。
  • 主要解决?在运行时期建立和删除原型。
  • 何时使用?
    • 当一个系统应该独立于它的产品创建,构成和表示时。
    • 当要实例化的类是在运行时刻指定时。
    • 为了避免创建一个与产品类层次平行的工厂类层次时。
    • 当一个类的实例只能有几个不同状态组合中的一种时。
  • 如何解决?用用已有的一个原型对象,快速地生成和原型对象一样的实例。
  • 关键代码?
    • 实现克隆操作。
    • 原型模式同样用于隔离类对象的使用者和具体类型之间的耦合关系,它同样要求这些‘易变类’拥有稳定的接口。
  • 注意:与通过对一个类进行实例化构建新对象不同的是,原型模式是通过拷贝一个现有对象生成新对象的。浅拷贝实现 Cloneable 重写,深拷贝则是通过实现 Serializable 读取二进制流。

# 大结

依赖关系的倒置:抽象不应该依赖于实现细节,实现细节应该依赖于抽象。抽象变化的慢,抽象比较稳定,具体细节变化的快。这是设计模式的精髓。 动机:在软件系统中,经常面临着某些结构复杂的对象的创建工作,由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口。 如何应对这种变化?如何向客户程序(使用这些对象的程序)隔离出这些易变对象,从而使得依赖这些易变对象的客户程序不随着需求的改变而改变。 意图:使用原型实例制定创建对象的种类,然后通过拷贝这些原型来创建新的对象。 要点:protype模式同样用于隔离类对象的使用者和具体类型之间的耦合关系,它同样要求这些易变类拥有稳定的接口。 Protype模式对于如何创建易变类的实体对象采用原型克隆的方法来做,它使得我们可以非常灵活地动态创建拥有某些稳定接口的新对象-所需工作仅仅是注册一个新类的对象(原型),然后在任何需要的地方不断地Clone。 Prototype模式中的Clone方法可以利用net中的Object类的MemberwiseClone()方法或者序列化来实现深度拷贝。

# 一句话概括

通过复制现有的实例来创建新的实例。

上次更新: 2025/03/22, 13:47:44
最近更新
01
vue3尚硅谷课件
04-26
02
Git问题集合
01-29
03
安装 Nginx 服务器
01-25
更多文章>
×
×