为什么80%的码农都做不了架构师?>>>
Java语言的一个优点就是取消了指针的概念,但也导致了许多程序员在编程中常常忽略了对象与引用的区别,特别是先学c、c++后学java的程序员。并且由于Java不能通过简单的赋值来解决对象复制的问题,在开发过程中,也常常要要应用clone()方法来复制对象。比如函数参数类型是自定义的类时,此时便是引用传递而不是值传递。下面举个小栗子:
比如Shape类
Shape shape1=new Shape()这时我们创建了一个shape1引用,我们把值只要赋给Shape类型的引用都可以操纵shape1所指向的引用,如果我们想把对象也复制一份。也就是说完完全全的两份不通过new来构造。
下来来看看UML图;
没什么技巧性的东西就是实现了Cloneable接口,然后重写clone()方法
/** * Created by gao.mq on 2017/4/26. */ public abstract class Shape implements Cloneable { public String type; public String getType() { return type; } public void setType(String type) { this.type = type; } abstract void draw(); @Override protected Object clone(){ Object object=null; try { object=super.clone(); }catch (CloneNotSupportedException e){ e.printStackTrace(); } return object; } }
/** * Created by gao.mq on 2017/4/26. */ public class Rectangle extends Shape { public Rectangle() { type = "rectangle"; } @Override void draw() { System.out.println("draw Rectangle"); } }
下面我们用缓存存下这个对象,使用时直接clone就行了
/** * Created by gao.mq on 2017/4/26. */ public class ShapeCache { private static Map<String,Shape> mapCache=new ConcurrentHashMap<>(); static { mapCache.put("rectangle",new Rectangle()); mapCache.put("square",new Square()); } public static Shape getShape(String type){ Shape shape= mapCache.get(type); return (Shape)shape.clone(); } }
测试
/** * Created by gao.mq on 2017/4/26. */ public class CloneDemo { public static void main(String[] args) { Shape cloneShape1 = ShapeCache.getShape("rectangle"); System.out.println("shape :"+cloneShape1.getType()); cloneShape1.draw(); } }
其实需要clone对象时直接实现Cloneable接口即可,没有那么麻烦,甚至说谈不上设计模式。