創作デザインパターンの一つです。
指定されたオブジェクトの複製/浅いコピーを作成するために使用されます。
このパターンは、オブジェクトを直接作成するとコストがかかる場合に役立ちます。例: 大規模なデータベースにクエリを実行した後にオブジェクトが作成される場合、オブジェクトを何度も作成するのはパフォーマンスの点で経済的ではありません。
したがって、オブジェクトが作成されると、そのオブジェクトをキャッシュし、将来同じオブジェクトが必要になった場合は、データベースから再度作成するのではなく、キャッシュからオブジェクトを取得し、データベース呼び出しを減らすために必要に応じてデータベースを更新します。 .
注: Cloneable を使用する必要があります。つまり、クローンを作成する必要があるオブジェクトのマーカー インターフェイスです。それ (Clonable) にはメソッドが含まれていません。これは、クラスをクローンできることを示します。これは、クラスのコピーを作成することを意味します。物体。
Object.clone() メソッドはデフォルトで浅いコピーを作成します
デフォルトでは、 clone() メソッドはオブジェクトの浅いコピーを実行します。これは、新しいオブジェクトを作成し、元のオブジェクトから新しいオブジェクトにすべてのフィールドをコピーすることを意味します。ただし、オブジェクトに他のオブジェクト (配列、リスト、カスタム オブジェクトなど) への参照が含まれている場合は、参照が指す実際のオブジェクトではなく、参照自体がコピーされます。
その結果、元のオブジェクトと複製されたオブジェクトの両方が、それらのフィールドに対して同じオブジェクトを参照することになります。 1 つのインスタンスを通じて参照オブジェクトに加えられた変更は、もう一方のインスタンスにも反映されます。
複製できる 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