代码实验05:设计模式-原型模式(Prototype Pattern)

代码实验05:设计模式-原型模式(Prototype Pattern)

首页角色扮演代号LaB更新时间:2024-10-06

初三,旭日东升贴赤口,收口纳福平安顺。Seven祝大家人旺财旺运道旺。

本文脑图

01

原型模式

原型模式(Prototype Pattern)是一种简单的设计模式。

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

原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后才能创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。

说白了就是以对象实例为原型模板复制新的对象。

02

包含角色

原型模式包含三个角色。

Java中内置了克隆机制,Object类具有一个clone()方法,能够实现对象的克隆,使一个类支持克隆需要以下两步。

为了使外部能够调用此类的clone()方法,可以将可访问性修改为public。因此,在Java中实现原型模式非常简单,让抽象原型Prototype接口继承 Cloneable 接口。

// 抽象原型 public interface Prototype extends Cloneable { } // 具体原型 public class ConcretePrototype implements Prototype { @Override public Object clone() throws CloneNotSupportedException { return super.clone(); } } // 客户角色 public class Client { public static void main(String[] args) throws CloneNotSupportedException { // 创建一个具体的原型模板对象 ConcretePrototype obj = new ConcretePrototype(); // 以该原型对象进行克隆 Object clone = obj.clone(); System.out.println(clone instanceof Prototype); } }

原型模式可以分为两种形式: 深拷贝和 浅拷贝。

深拷贝:当一个类的拷贝方法,不仅要复制对象的所有非引用成员变量值,还要为引用类型的成员变量创建新的实例,并且初始化为形式参数实例值。这个方式称为深拷贝。也就是说浅拷贝只复制一个对象,传递引用,不能复制实例。而深拷贝对对象内部的引用均复制,它是创建一个新的实例,并且复制实例。对于浅拷贝当对象的成员变量是基本数据类型时,两个对象的成员变量已有存储空间,赋值运算传递值,所以浅拷贝能够复制实例。但是当对象的成员变量是引用数据类型时,就不能实现对象的复制了。

03

原型模式的应用

我们先来看看原型模式的优缺点。

优点

缺点

使用场景

  1. 资源优化场景。
  2. 类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。
  3. 性能和安全要求的场景。
  4. 通过 new 产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。
  5. 一个对象多个修改者的场景。
  6. 一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。
  7. 在实际项目中,原型模式很少单独出现,一般是和工厂方法模式一起出现,通过 clone 的方法创建一个对象,然后由工厂方法提供给调用者。

在框架中的应用实例

04

原型模式示例

使用原型模式模拟一个克隆邮件群发的实例。

@Data public class Mail implements Cloneable { public Mail(String subject, String context) { this.subject = subject; this.context = context; } // 收件人 private String receiver; // 主题 private String subject; // 称呼 private String appellation; // 邮件内容 private String context; // 邮件的尾部 private String tail; @Override public Mail clone() throws CloneNotSupportedException { return (Mail) super.clone(); } } // 上述代码中,Mail类实现Cloneable接口,并实现了clone()方法,该方法是实现原型模式的关键,只有实现clone()方法,在应用中才能对Mail进行复制克隆。 public class MailClient { public static void main(String[] args) throws CloneNotSupportedException { Mail mail = new Mail("某商城春节抽奖活动", "春节抽奖通知:凡在春节期间在本商场购物满100元即可获得抽奖机会"); mail.setTail("本活动解析权归商城所有"); // 模拟发送给商城的所有用户,这里模拟5个 for (int i = 0; i < 5; i ) { Mail cloneMail = mail.clone(); // 设置收件人和称呼,实际是从数据库获取的 cloneMail.setReceiver("zhangsan" i "@123.com"); cloneMail.setReceiver("zhangsan" i " 先生(女士)"); sendMail(cloneMail); } } public static void sendMail(Mail mail) { System.out.println("标题:" mail.getSubject() " 收件人:" mail.getReceiver() " 发送成功"); } }


原型模式的分享介绍到这里就介绍完了,至此,创建型的所有设计模式全部介绍完了,我们可以了解到:

接下来进入结构型模式。

我是Seven,一个不懈努力的程序猿,希望本文能对你有所裨益

Seven的代码实验室

一只不懈努力的程序猿,通过代码实验洞悉技术的本质

查看全文
大家还看了
也许喜欢
更多游戏

Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved