package com.hy.questionbank.设计模式.原型模式; import lombok.Data; /** * 原型模式(Prototype Pattern) * 原型设计模式允许通过复制现有对象来创建新对象,而不是通过实例化类来创建新对象。 * 在需要创建大量相似对象时非常有用,它可以避免重复创建对象,从而提高性能,并且可以根据需要实现浅拷贝或深拷贝。 * 在Java中,原型模式的实现通常涉及到实现Cloneable接口和重写clone()方法。 * 浅克隆:复制对象时仅仅复制对象本身,包括基本属性,但该对象的属性引用其他对象时,该引用对象不会被复制,即拷贝出来的对象与被拷贝出来的对象中的属性引用的对象是同一个。 * * 深克隆:复制对象本身的同时,也复制对象包含的引用指向的对象,即修改被克隆对象的任何属性都不会影响到克隆出来的对象。需要在clone方法clone一份引用属性对应的对象,再赋值给引用属性 */ @Data public abstract class Shape implements Cloneable{ private String id; protected String type; public abstract void draw(); @Override public Object clone() { Object clone = null; try { clone = super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return clone; } }
package com.hy.questionbank.设计模式.原型模式; public class Circle extends Shape{ public Circle() { type = "Circle"; } @Override public void draw() { System.out.println("Inside Circle::draw() method."); } }
package com.hy.questionbank.设计模式.原型模式; public class Square extends Shape { public Square() { type = "Square"; } @Override public void draw() { System.out.println("Inside Square::draw() method."); } }
package com.hy.questionbank.设计模式.原型模式; import java.util.HashMap; import java.util.Map; public class ShapeCache { private static Map<String, Shape> shapeMap = new HashMap<>(); public static Shape getShape(String shapeId) { Shape cachedShape = shapeMap.get(shapeId); return (Shape) cachedShape.clone(); } // For each shape run database query and create shape // shapeMap.put(shapeKey, shape); // for example, we are adding three shapes 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); } public static void main(String[] args) { ShapeCache.loadCache(); Shape clonedShape = ShapeCache.getShape("1"); System.out.println("Shape : " + clonedShape.getType()); Shape clonedShape2 = ShapeCache.getShape("2"); System.out.println("Shape : " + clonedShape2.getType()); } }