原型模式:Prototype Pattern。
原型模式:
/** * Specify the kinds of objects to create using a prototype instance , * and create new objects by coping this prototype */
用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。
原型模式的三个角色:
-
客户端:该角色提出对象的请求。
-
抽象原型:该角色是一个抽象角色,通常有一个Java接口或者抽象类实现,给出所有的具体原型类所需要的接口。
-
具体原型:该角色是被复制的对象,必须实现抽象原型接口。
Java中内置了克隆机制,Object的clone方法,能够实现对象的克隆,但是需要两个步骤:
1,实现Cloneable接口,
2,重写Object的clone方法,完成对象的克隆操作,通常只需要调用Object的clone方法即可,为了使外部能够调用此类的clone方法,可以将可访问修饰符改成public。
案例
public interface Prototype extends Cloneable { Prototype clone(); } public class ConcretePrototype implements Prototype { @Override public Prototype clone() { try { return (Prototype)super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return null; } } public class Client { private void operation(Prototype prototype) { //获取新对象 Prototype p = prototype.clone(); } }
实战使用
我们通常对一个对象进行拷贝的时候会用到下面几个类,他们都是基于原型模式来实现的,如果你用过下面这些类了就别说你没用过原型模式,再者面试的时候也可以扯扯什么是原型模式。
BeanUtils、JSON.parseObject()、Gava
优缺点
性能良好:原型模式是在内存二进制流中复制,要比直接new一个对象性能要好,特别是在一个循环体内产生大量的对象时,原型模式可以更好地提现其优点。
逃避构造函数:可以说是优点,也可以说是缺点,因为减少了约束,需要在实际用时进行权衡考虑,考虑其是否有安全问题等。
使用场景
1,类初始化消耗资源多,
2,new产生的一个对象需要非常繁琐的过程(准备数据,权限访问等)
3,构造函数比较复杂
4,循环体重生产大佬对象时,代码可读性下降
在实际给吸纳灌木中,原型模式很少单独出现,一般是和工厂方法模式一起出现,通过clone方法创建一个对象,然后由工厂方法提供者给调用者。
用下面这张图来形容拷贝,貌似挺不错的,军人都是一样的帅,不近看就以为他们是一模一样的。
另外就是很经典的齐天大圣孙悟空的变身,猴毛一吹就变成很多个孙悟空了,