有人记得多莉吗? 是的,是绵羊,是第一个被克隆的哺乳动物。 好吧,我不想深入研究细节,但是关键是全部与克隆有关。 这是关于创建副本。
原型设计模式与这个现实示例非常相似。 这是“四个设计模式的帮派”的“创新设计模式”系列的另一部分。
因此,此模式通过克隆对象而不是与Factory模式不同的创建来工作。
何时使用此模式?
- 创建对象的成本是昂贵还是复杂。
- 尝试将应用程序中的类数保持在最低限度时
- 在运行时添加或删除对象时
- 当客户端应用程序不需要知道对象的创建,组成和表示时。
- 需要与现有对象相似的对象
原型模式有什么作用?
原型模式允许通过复制现有实例来制作新实例。 原型模式会导致克隆的对象与原始对象不同。 克隆时,原始状态与克隆相同。 之后,每个对象可以经历状态改变。 我们可以修改对象以执行不同的事情。 唯一的好处是,客户端可以在不知道实例化哪个特定类的情况下创建新实例。
结构体:
原型类通过实现Cloneable接口并使用clone()方法声明一个用于克隆自身的接口。 具体的原型实现用于克隆自身的clone()方法。 客户端类通过要求Prototype克隆自己而不是使用new关键字来创建一个新对象。
事件流以这样的方式工作,即原始类(例如A类)已经被初始化和实例化。 这是因为我们不能按原样使用克隆。 我们需要在使用它之前实例化原始类(A类)。 然后,客户端向Prototype类请求与A类相同类型的新对象。根据所需对象类型而定的具体原型通过使用clone()方法克隆自身来提供该对象。
想象一下一个场景,其中可能存在一些要求,我们必须从后端获取用户配置文件数据以进行多种处理,例如用户配置文件或角色等,而这些更改不会经常更改。 因此,我们可能不得不使用昂贵的数据库资源,连接和事务。 在这种情况下,我们可以将数据存储在单个调用中,并将其缓存在会话中以进行进一步处理。
在上面的示例中,UserProfile对象是将被克隆的主要对象。 UserProfile实现Cloneable接口。 BankDetails和Identity类继承自UserProfile类。 这些是具体的原型类。
我们引入了一个名为UserProfileRegistry的新类,该类可以找到适当的UserProfile实例,然后将克隆适当地返回给客户端类。
要在运行时创建另一个对象(要克隆的对象的真实副本)时,需要克隆()一个对象。 真实副本意味着新创建的对象的所有属性应与您要克隆的对象相同。 如果可以通过使用new实例化该类,则将获得一个具有所有属性作为其初始值的Object。 例如,如果您正在设计一个用于执行银行帐户交易的系统,那么您将想要制作一个保存您的帐户信息的对象的副本,对其进行交易,然后将原始对象替换为修改后的对象。 在这种情况下,您可能希望使用clone()而不是new。
有趣的 一点 :
- 创意设计模式可以共存,例如,抽象工厂,构建器和原型可以在实现过程中使用单例模式,或者它们也可以单独工作。
- 原型模式肯定需要初始化操作,但不需要子类化,但是Factory Method需要子类化,但不需要初始化操作。
- 在银行交易昂贵的数据库查询中,这是有利的。 缓存可能会有所帮助,并且原型模式是对此情况的最佳解决方案,因为可以使用具有银行帐户信息或用户配置文件信息的对象的副本,对其进行事务处理,然后将原始对象替换为修改后的对象。
- 上面的示例使用了浅克隆方法。 但是,我们也可以通过深度克隆来实现。 有关此主题的详细说明,请参见我们的文章: 深入研究克隆 。
优点:
- 隐藏了创建对象的复杂性。
- 客户可以在不知道对象类型的情况下获取新对象。
- 减少子类化。
退税:
- 使用原型的缺点是复制对象有时会很复杂。
- 具有循环引用其他类的类不能真正被克隆。
下载源代码:
参考: 原型设计模式:在Idiotechie博客上,由我们的JCG合作伙伴 Mainak Goswami 创建另一个小车 。
翻译自: https://www.javacodegeeks.com/2012/11/prototype-design-pattern-creating-another-dolly.html