本博客大部分内容来于免费在线学习设计模式
1:原型模式
原型模式是一种创建型设计模式,使你能够复制已有对象,而又无需使代码依赖它们所属的类。
2:原型模式问题
如果你有一个对象,并希望生成与其完全相同的一个复制品,你该如何实现呢?首先,你必须新建一个属于相同类的对象。然后,你必须遍历原始对象的所有成员变量,并将成员变量值复制到新对象中。
但是并非所有对象都能通过这种方式进行复制, 因为有些对象可能拥有私有成员变量, 它们在对象本身以外是不可见的。
3:原型模式解决方法
用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,根本无须知道对象创建的细节。例如,Windows 操作系统的安装通常较耗时,如果复制就快了很多。在生活中复制的例子非常多,这里不一一列举了。
4:原型模式解决方案
- 原型 (Prototype) 接口将对克隆方法进行声明。 在绝大多数情况下, 其中只会有一个名为 clone克隆的方法。
- 具体原型 (Concrete Prototype) 类将实现克隆方法。 除了将原始对象的数据复制到克隆体中之外, 该方法有时还需处理克隆过程中的极端情况, 例如克隆关联对象和梳理递归依赖等等。
- 客户端 (Client) 可以复制实现了原型接口的任何对象。
由于 Java 提供了对象的 clone() 方法,所以用 Java 实现原型模式很简单。
代码参考对象克隆
5:原型模式适用场景
- 如果你需要复制一些对象, 同时又希望代码独立于这些对象所属的具体类, 可以使用原型模式。
- 如果子类的区别仅在于其对象的初始化方式, 那么你可以使用该模式来减少子类的数量。 别人创建这些子类的目的可能是为了创建特定类型的对象。
6:原型模式优缺点
优点 | 缺点 |
---|---|
你可以克隆对象, 而无需与它们所属的具体类相耦合。 | 克隆包含循环引用的复杂对象可能会非常麻烦。 |
你可以克隆预生成原型, 避免反复运行初始化代码。 | |
你可以更方便地生成复杂对象。 | |
你可以用继承以外的方式来处理复杂对象的不同配置。 |
7:原型模式与其他模式关系
- 在许多设计工作的初期都会使用工厂方法模式(较为简单,而且可以更方便地通过子类进行定制),随后演化为使用抽象工厂模式、原型模式或生成器模式(更灵活但更加复杂)。
- 抽象工厂模式通常基于一组工厂方法,但你也可以使用原型模式来生成这些类的方法。
- 原型可用于保存命令模式的历史记录。
- 大量使用组合模式和装饰模式的设计通常可从对于原型的使用中获益。你可以通过该模式来复制复杂结构,而非从零开始重新构造。
- 原型并不基于继承,因此没有继承的缺点。另一方面,原型需要对被复制对象进行复杂的初始化。工厂方法基于继承,但是它不需要初始化步骤。
- 有时候原型可以作为备忘录模式的一个简化版本,其条件是你需要在历史记录中存储的对象的状态比较简单,不需要链接其他外部资源,或者链接可以方便地重建。
- 抽象工厂、生成器和原型都可以用单例模式来实现。
8:原型模式举例
拿克隆来举例:dna就是原型,它仅仅是一种概念,声明了生物可以克隆,但是不具体到每一种生物身上,是无法实现克隆。而生物就是具体原型,它实现了克隆方法:拥有了自己独一无二的dna,所以可以根据它的dna来进行克隆。