惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
SegmentFault 最新的问题
J
Java Code Geeks
V
V2EX
Blog — PlanetScale
Blog — PlanetScale
博客园 - 司徒正美
Hugging Face - Blog
Hugging Face - Blog
F
Fortinet All Blogs
aimingoo的专栏
aimingoo的专栏
B
Blog
A
About on SuperTechFans
有赞技术团队
有赞技术团队
月光博客
月光博客
Microsoft Azure Blog
Microsoft Azure Blog
阮一峰的网络日志
阮一峰的网络日志
腾讯CDC
美团技术团队
大猫的无限游戏
大猫的无限游戏
爱范儿
爱范儿
N
Netflix TechBlog - Medium
C
Check Point Blog
Recent Announcements
Recent Announcements
博客园 - Franky
博客园 - 叶小钗
T
Tailwind CSS Blog

Sehnsucht

记一次博客换图床的过程 观《花束般的恋爱》 读《活过》 东京 旅行篇 亲人逝去 我为什么想养鱼 防止AI爬取你的博客 「monthly 」博客重构 游戏全成就 好看的小说 人生的每一步都不会是浪费-2024年终 「weekly」星期五综合征 「weekly」听播客 杂谈 读《美丽新世界》 「weekly」社交媒体 恶性事件 新世界 「weekly」认知觉醒 美丽新世界 follow 「weekly」独立博客9问题 双十一买书 读《惊呆了!原来这就是社会学》 一次聊天与自我建设 2024-09月记 补番《relife》 树状数组简单理解 lvm简单使用 博客自动发布方案 某公众号废案 fail2ban基本使用 Podman 环境使用 Nginx Proxy Manager 最佳实践 2024-07同学聚会 vps使用podman部署freshrss Gitlab CICD 实践,思考与记录 装备升级:新的PC gitlab局域网搭建流程
原型模式
2021-03-09 · via Sehnsucht

原型模式

即对于对象,我们通过类似复制的形式进行克隆,对于创建对象代价较大时,使用new进行创建就会使效率低下,使用原型模式就会提高效率 需要注意的就是深克隆和浅克隆

实现形式

实现Cloneable接口 重写clone方法

代码实现

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Pig implements Cloneable{
    private int weight;
    private Date birthDate;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
public class Consumer {
    public static void main(String[] args) throws CloneNotSupportedException {
        Date date = new Date();
        Pig pig = new Pig(99,date);
        System.out.println(pig);
        System.out.println(pig.hashCode());

        Pig clone = (Pig) pig.clone();
        System.out.println(clone);
        System.out.println(clone.hashCode());

    }
}

此时结果为

Pig(weight=99, birthDate=Tue Mar 09 19:47:47 CST 2021)
382774248
Pig(weight=99, birthDate=Tue Mar 09 19:47:47 CST 2021)
382774248

假设我们在最后加上

date.setDate(999);
System.out.println(pig);
System.out.println(clone);

可以发现,pig和clone对象的date都变了,类似于深拷贝和浅拷贝,有深克隆和浅克隆之分 上面的例子就是浅克隆,如果需要深克隆,有多种方式,我们可以采用重写clone方法的形式深克隆

举例上面的例子,Pig类改写成

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Pig implements Cloneable{
    private int weight;
    private Date birthDate;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Pig pig = (Pig) super.clone();
        //对birthDate也进行clone
        pig.birthDate = (Date) this.birthDate.clone();
        return pig;
    }
}

就会变成深克隆

应用

在Spring中 配置的xml文件里,如下,scope的属性如果是prototype就是原型模式,如果是singleton就是单例模式

<bean id="user2" class="com.Cai.pojo.User" c:name="c22" c:age="22" scope="prototype"/>
<!--    singleton单例模式-->
<!--    prototype原型模式-->