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,使用场景的话,更适合在编码过程中发现曾经有一个实例我使用了复杂的过程创建,然后我要再次创建该实例,于是我做了一个框架专门处理这个事情。
无实例类图
