初三,旭日东升贴赤口,收口纳福平安顺。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
原型模式的应用
我们先来看看原型模式的优缺点。
优点
缺点
使用场景
在框架中的应用实例
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