设计模式笔记 ------ 原型模式
“复制-粘贴”应该是每个程序员最经常干的事情了。那为什么不去一个个敲出来?因为麻烦啊。如果把敲字看做创建对象时构造函数里干的事情,那“复制-粘贴”就能算是原型模式了。
原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
UML类图如下
Prototype是一个有clone()方法的接口,其下实现的就是可以通过克隆自身的原型类。
看一个例子,超市的同类销售套装里面包含的东西应该是一样。
首先是接口(java里原型类可以直接实现Cloneable,也必须实现,否则系统clone()方法会抛出异常。)
public interface SellingPackage extends Cloneable{ public SellingPackage clone(); }
原型类
public class SellingPackageEntity implements SellingPackage { private String name; private int count; private int price; public SellingPackageEntity(String name, int count, int price) { this.name = name; this.count = count; this.price = price; } public SellingPackage clone(){ SellingPackage result = null; try { result = (SellingPackageEntity) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return result; } public void display() { System.out.println(name + "中数量有" + count + ",价格" + price + "元"); } }
客户端
public class POC { public static void main(String[] args) { SellingPackageEntity sellingPackage1 = new SellingPackageEntity("销售套装", 10, 99); SellingPackageEntity sellingPackage2 = (SellingPackageEntity) sellingPackage1.clone(); sellingPackage1.display(); sellingPackage2.display(); if(sellingPackage1 == sellingPackage2){ System.out.println("两者是同一个销售套装"); }else{ System.out.println("两者不是同一个销售套装"); } } }
结果中可以看到,对象内容一样,但是并不是同一个对象。
在原型模式中,重点在于clone,在复制的时候有的点非常重要,即是深复制和浅复制。如果你想把工作电脑中的文件拷贝到个人电脑上,拷贝快捷方式一定是不可取的吧?毫无疑问的事情。在clone()方法中,只能复制值类型的成员变量,如果是引用类型的变量,就需要在方法体内再做处理了。这也是原型模式的缺点了,深复制会比较复杂。
总结一下
意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
主要解决:在运行期建立和删除原型。
何时使用: 1、当一个系统应该独立于它的产品创建,构成和表示时。 2、当要实例化的类是在运行时刻指定时,例如,通过动态装载。 3、为了避免创建一个与产品类层次平行的工厂类层次时。 4、当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。
如何解决:利用已有的一个原型对象,快速地生成和原型对象一样的实例。