原型模式中主要用到Cloneable这个接口,来实现浅拷贝,下面是具体内容:
原型模式的适用场合:
1、实际项目中很少单独出现,一般与工厂模式一起出现,通过clone创建对象,并由工厂方法提供给调用者使用;
2、如果这个类的初始化非常复杂,需要消耗较多的资源(数据,硬件资源);
3、资源优化、性能和安全有要求的场景;
4、通过new创建对象比较繁琐或者需要访问权限;
5;多人访问一个对象,多个调用者都需要修改其值,使用原型模式拷贝多个对象提供给调用者使用
优点:提高性能,逃避构造器的约束
缺点:
1、必须实现Cloneable接口;
2、实现克隆时,必须对该类的功能进行全盘考虑,尤其是已有的类,或者是该类不支持串行化的间接对象,或者引用含有循环结构的时候
代码实现:
1:创建一个实现Cloneable接口的抽象类
package prototype_pattern; public abstract class Shape implements Cloneable { private String id; protected String type; abstract void draw(); public String getType(){ return type; } public String getId(){ return id; } public void setId(String id){ this.id=id; } public Object clone(){ Object clone=null; try{ clone=super.clone(); }catch(CloneNotSupportedException e){ e.printStackTrace(); } return clone; } }
2、创建扩展上面抽象类的实体类:Rectangle.java Circle.java Square.java
package prototype_pattern; public class Rectangle extends Shape { public Rectangle(){ type="Rectangle"; } void draw(){ System.out.println("Rectangle"); } } package prototype_pattern; public class Circle extends Shape{ void draw(){ System.out.println("Circle"); } public Circle(){ type="Circle"; } } package prototype_pattern; public class Square extends Shape { void draw(){ System.out.println("Square"); } public Square(){ type="Circle"; super.setId("2"); } }
3:创建一个类,从数据库中获取实体类,并将它们保存在hashtable中
package prototype_pattern; import java.util.Hashtable; public class ShapeClone { private static Hashtable <String,Shape> shapeMap = new Hashtable(); public static Shape getShape(String shapeId){ Shape cacheShape = shapeMap.get(shapeId); return (Shape)cacheShape.clone(); } public static void loadCache(){ Circle circle= new Circle(); circle.setId("1"); shapeMap.put(circle.getId(), circle); Square square= new Square(); square.setId("2"); shapeMap.put(square.getId(), square); Rectangle rectangle=new Rectangle(); rectangle.setId("3"); shapeMap.put(rectangle.getId(), rectangle); } }
4.测试demo
package prototype_pattern; public class PrototypePatternDemo { public static void main(String[] args) { ShapeClone.loadCache(); Shape cloneShape = ShapeClone.getShape("1"); System.out.println("Shape:"+cloneShape.getType()); Shape cloneShape1 = ShapeClone.getShape("2"); System.out.println("Shape:"+cloneShape1.getType()); Shape cloneShape2= ShapeClone.getShape("3"); System.out.println("Shape:"+cloneShape2.getType()); } }
5:运行结果
备注:
常说的浅拷贝:实现Cloneable接口,重写clone();
深拷贝:实现Serializable接口,读取二进制流