目录
[显示]

1.摘要

一般在需要创建对象时,创建者都是知道需要创建对象的类型之后调用构造函数并用相关的初始化语句完成对象的初始化。Prototype模式则是“利用对象创建对象”的模式,允许调用者在不了解类型的情况下创建该类型的实例。

2. 针对问题

一般在需要创建对象时,创建者都是知道需要创建对象的类型之后调用构造函数并用相关的初始化语句完成对象的初始化。假设有这么一个场景:领导拿了一摞演讲稿让你再准备一份,这个时候有两种思路:打开word,把演讲稿重新敲一遍,然后打印出来;或者直接去复印一份。
Prototype模式就类似于复印的思路。这里演讲稿可以作为一个类,稿子里的文字是演讲稿实例中的内容。Prototype模式更准确的说是“利用对象创建对象”的模式,而当作模版的对象就叫做prototype。

3. 介绍

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

4. 实现

4.1. 基本实现

Prototype模式的UML图如下:

基本实现非常简单,只要让某个类型提供Clone方法,返回自身的拷贝就可以了,但是要注意:
1、为了保证通用性,Clone方法一般是没有参数的。通过复制生成的对象需要在初始化Clone方法外初始化。
2、复制时要区分浅拷贝与深拷贝。简单的说,浅拷贝只是拷贝了指向内容的指针,两个对象在内存中共享一份数据。而深拷贝则是通常意义上的拷贝。关于深浅拷贝的内容与模式无关,就不展开说明了。唯一值得提醒的一点:深拷贝的实现必须是对所有字段递归的深拷贝。
3、如果追求效率,Clone函数不一定需要用面向对象的方法实现。

4.2. 原型管理器

当系统中原型的数量不固定时,可以考虑建立原型管理器,通过该对象存储及检索原型。管理器一般只要实现三个接口就可以了:

原型管理器的意义在于可以在运行时保存和获取特定类型的对象,也就是说,它可以作为反射的代替品。

5. 特点

1、通过对象创建对象,实质上包含两个含义:创建与原型对象类型相同的对象、创建与原型对象内容相同的对象。利用第一个特性可以实现与Abstract Factory模式相似的功能。
2、可以为不支持类对象的语言增加类似反射的机制。

6. 相关文章

设计模式总结

7. 参考文章

  1. 《设计模式_可复用面向对象软件的基础》