1.场景
大学的时候毕业论文太难写了,所以直接抄同学的,但是这种你并不是一个字一个字的重写。而是使用cv大法(ctrl+c和ctrl+v),直接将毕业论文进行复制粘贴。然后自己就可以安心的去打游戏了。
原型模式是一种创建型模式,例如我们要创建一个Student对象都是采用的new Student();但是有些时候对象的创建十分复杂,这个时候原型模式就登场了,就像毕业论文太长了自己写太麻烦。所以我们选择复制。
2.原型模式结构图
Product是一个接口,表示产品的接口,只要是产品都会实现此接口,例如Television(电视)和Computer(电脑)。同时Product继承了Cloneable,原因是原型模式的复制是要基于clone方法的,而clone方法必须实现Cloneable接口。
3.原型模式的实现
Product是一个接口,表示产品的接口,只要是产品都会实现此接口。
Television(电视)表示的就是电视产品,实现Product接口。同时拥有自己的品牌和制造日期。
Computer(电脑)表示的就是电脑产品,实现Product接口。同时拥有自己的品牌和制造日期。
Computer(电脑)和Television(电视)都是一个产品,可以理解为这两个对象是很难创建的,相当于同学的毕业论文,我们如果自己去写毕业论文由于太长了就比较困难。
可以看到我们只需要调用具体产品的createClone方法,进行复制即可,此时对象就重新被创建出来了,也就是复制了同学的毕业论文。
ps:需要注意,代码中实现的clone只是浅拷贝,而不是深拷贝。如果业务需要应该使用深拷贝进行复制操作。
4.JDK中的原型模现
同样是ArrayList,的clone方法。可以看到ArrayList就是这样一个场景,当ArrayList中存储的数据太多的时候,如果我们自己在重新创建一个一样的,实际上是很复杂的,而clone方法则帮我们进行了复制。
原型模式一般是解决对象的创建比较复杂的场景,原型模式优缺点如下
优点:能够解决复杂对象的创建,同时进行解耦,如果复杂的每次自己创建,再具体产品进行修改后,业务代码全部可能会进行调整。
缺点:每个具体的产品必须要实现Cloneable接口,同时如果要实现深拷贝实际上是比较复杂的。