【设计模式】原型模式
使用频率:★★★☆☆
一、什么是原型模式
通过复制一个已存在对象来生成一个新对象,被复制的对象称为原型;
二、补充说明
1、JAVA中Object的clone方法已经为什么提供了复制对象的实现,且该方法为本地方法,性能好,在需要大量复制对象的情况,使用clone创建对象比new效率高;
补充下深拷贝和浅拷贝,深拷贝是通过拷贝内存(包括引用的对象)实现对象的创建;浅拷贝不拷贝引用的对象,但拷贝了引用的值,如果类的成员属性中都是基本类型,不含对象,也是可以达到深拷贝的效果;深拷贝可以通过将对象序列化成字节流以及反序列化实现,浅拷贝直接调用clone即可;
2、使用原型模式创建对象是没有调用类的构造方法的;
三、角色
原型角色(ps,也可以搞成两个,如抽象原型角色以及各个具体实现原型角色)
四、JAVA实现例子
java已经很好的支持原型模式了,使用很简便,如下类,实现了Cloneable接口,即成了一个原型;
package com.pichen.dp.creationalpattern.prototype; public class Cell implements Cloneable{ private int cellId; public int getCellId() { return cellId; } public void setCellId(int cellId) { this.cellId = cellId; } public Cell(int id) { this.cellId = id; } @Override public Object clone() throws CloneNotSupportedException { System.out.println("clone a cell obj."); return (Cell) super.clone(); } }
使用原型,复制10个拷贝:
package com.pichen.dp.creationalpattern.prototype; public class Main { public static void main(String[] args) throws CloneNotSupportedException { Cell prototypeCell = new Cell(888); for(int i = 0; i < 10; i++){ Cell copyCell = (Cell) prototypeCell.clone(); System.out.println(copyCell.hashCode() + ":" + copyCell.getCellId()); } } }
观察打印结果,hashcode不同,对象成员属性一致,复制成功:
clone a cell obj. 25840096:888 clone a cell obj. 33040770:888 clone a cell obj. 23930419:888 clone a cell obj. 15142448:888 clone a cell obj. 22316618:888 clone a cell obj. 3969559:888 clone a cell obj. 10175206:888 clone a cell obj. 21307627:888 clone a cell obj. 24389376:888 clone a cell obj. 11317592:888