设计模式之Prototype模式

Prototype模式是一种用于创建实例的模式,通过实现Cloneable接口并重写clone()方法,实现对象的复制。此模式常用于当实例创建过程复杂或无法通过常规构造函数创建时。Manager类作为一个容器,负责对象的注册和克隆,降低了类之间的耦合。clone()方法执行的是浅拷贝,提供了一种在不破坏封装性的前提下复制对象的方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Prototype模式

概述

Prototype模式,直译:(原型模式)

归类:解决问题

应用场景:无法简单的生成实例,或者是无法通过new myClass()创建实例

类图

案例

public interface Product extends Cloneable{
    public abstract void use(String s);
    public abstract Product createClone();
}
public class Manager {
    private HashMap showcase = new HashMap<>();

    public void register(String name, Product proto) {
        showcase.put(name, proto);
    }

    public Product create(String protoname) {
        Product p = (Product) showcase.get(protoname);
        return p.createClone();
    }
}

分析

Product接口

该接口共定义了两个方法,use方法主要面向用户,createClone则主要面向实现类,use的作用是定义该类的具体使用方法,createClone则是对该类进行复制。

Cloneable接口

在Product接口中,继承了Cloneable接口,该接口是一个标记型的接口,内部没有方法和属性,其作用是表示该实例可以使用clone()来按字段进行复制。

clone()方法

Prototype模式使用clone()来拷贝实例,本文重点并不在于解释clone(),但笔者认为仍需知道clone()是浅拷贝,即地址及其指向的对象都与原型对象不同,非引用关系,而是确实具有多个实例,与Singleton模式中只有单实例有很大的不同,但是拷贝生成的对象与原型对象所引用的值确仍为同一对象。若无法理解可移步https://blog.youkuaiyun.com/Da_Xiong000/article/details/105833733进行学习。

Manager类

该类共有两个方法,注册与创建,通俗了讲的话,Manager就像是一个容器,注册的过程就是放进来的过程,创建的过程就是取出去的过程,而这个取并不是将原来的东西取了出去,而是拷贝了一份一模一样的东西取了出去。而这种使用容器的方法,在一些框架或者是一些编程思想中常用,笔者曾在撰写简易版Hibernate的时候使用过,具体体现在IOC上。

小结

关于Prototype模式,笔者所认为的价值在于,它巧妙利用了HashMap的特性,将框架与类实现解耦,再通俗了描述则是采用了后命名的方式,原先的代码中,若是要在A类中引用B类,都是需要将B类注入A类中,这样做的话就会将AB类耦合在一起,作为框架而言,尽可能的解耦才能使框架的可用性更高。而后命名,则是先创建类,再命名,放入容器中。这就像我生下来就拥有四肢,我没法无条件的和他们失去联系,若是遇到了四肢是累赘的情况,那么我很可能就完成不了这件事,但是如果我是拿锤子去锤钉子,我给他命名了,然后当遇到了锤子必须被卸下的环境,我就将它舍去去完成该任务。这大致就是我的理解。再谈到clone本身的意义,确实是会有相当多的情况,实例再第一次创建时就经历了比较复杂的过程,还有配置等情况,若是想要再次创建出该实例,复制则是一个好的方法。而这也只是解决了一个问题,那就是要生成的复杂的对象在之前就已经被创建出来,然后要再次使用它时会使用clone,使用场景的话,更适合在编码过程中发现曾经有一个实例我使用了复杂的过程创建,然后我要再次创建该实例,于是我做了一个框架专门处理这个事情。

无实例类图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值