창의적인 디자인 패턴 중 하나입니다.
주어진 객체의 중복/얕은 복사본을 만드는 데 사용됩니다.
이 패턴은 객체를 직접 생성하는 것이 비용이 많이 드는 경우에 유용합니다. 예: 대규모 데이터베이스를 쿼리한 후 객체를 생성한 경우 객체를 계속해서 생성하는 것은 성능 측면에서 경제적이지 않습니다.
따라서 객체가 생성되면 객체를 캐시하고 나중에 동일한 객체가 필요할 때 데이터베이스에서 다시 생성하는 대신 캐시에서 객체를 가져오고 데이터베이스 호출을 줄이기 위해 필요할 때 데이터베이스를 업데이트합니다. .
참고: Cloneable을 사용해야 합니다. 즉, 복제해야 하는 개체에 대한 마커 인터페이스입니다. it(Clonable)에는 메서드가 포함되어 있지 않으며 클래스를 복제할 수 있다는 신호를 보냅니다. 이는 클래스의 복사본을 만드는 것을 의미합니다. 물체.
Object.clone() 메서드는 기본적으로 얕은 복사본을 생성합니다.
기본적으로 clone() 메서드는 객체의 단순 복사본을 수행합니다. 즉, 새 개체를 만들고 원래 개체의 모든 필드를 새 개체에 복사합니다. 그러나 개체에 다른 개체(예: 배열, 목록 또는 사용자 정의 개체)에 대한 참조가 포함되어 있는 경우 참조가 가리키는 실제 개체가 아닌 참조 자체가 복사됩니다.
결과적으로 원본 개체와 복제된 개체는 모두 해당 필드에 대해 동일한 개체를 참조합니다. 한 인스턴스를 통해 참조된 개체에 대한 모든 변경 사항은 다른 인스턴스에 반영됩니다.
복제할 수 있는 Shape 개체의 예를 통해 이를 이해해 보겠습니다.
모양
public class Shape implements Cloneable { private String id; protected String shape; @Override public String toString() { return "Shape [id=" id ", shape=" shape "]"; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getShape() { return shape; } @Override public Object clone(){ Object clone = null; try { clone = super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return clone; } }
하위 수업
public class Rectangle extends Shape { public Rectangle(){ shape = "Rectangle"; } public void draw(){ System.out.println("calling draw() of Rectangle shape"); } } public class Circle extends Shape { public Circle(){ shape = "Circle"; } public void draw(){ System.out.println("Calling draw in Circle method"); } }
은닉처
public class ShapeCache { public static HashMapcache = new HashMap(); public static Shape cloneObject(String id){ return (Shape)cache.get(id); } public static void addShapeInCache(Shape shape){ cache.put(shape.getId(),shape); } }
기본
public class Main { public static void main(String args[]){ Shape circle = new Circle(); circle.setId("1"); Shape rectangle = new Rectangle(); rectangle.setId("2"); ShapeCache.addShapeInCache(rectangle); ShapeCache.addShapeInCache(circle); Shape copyShape1 = (Shape) ShapeCache.cache.get(circle.getId()); Shape copyShape2 =(Shape) ShapeCache.cache.get(rectangle.getId()); System.out.println(copyShape1); System.out.println(copyShape2); } }
산출:
Shape [id=1, shape=Circle] Shape [id=2, shape=Rectangle]
핵심사항
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3