「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > プロトタイプ

プロトタイプ

2024 年 11 月 8 日に公開
ブラウズ:934

Prototype

創作デザインパターンの一つです。
指定されたオブジェクトの複製/浅いコピーを作成するために使用されます。
このパターンは、オブジェクトを直接作成するとコストがかかる場合に役立ちます。例: 大規模なデータベースにクエリを実行した後にオブジェクトが作成される場合、オブジェクトを何度も作成するのはパフォーマンスの点で経済的ではありません。
したがって、オブジェクトが作成されると、そのオブジェクトをキャッシュし、将来同じオブジェクトが必要になった場合は、データベースから再度作成するのではなく、キャッシュからオブジェクトを取得し、データベース呼び出しを減らすために必要に応じてデータベースを更新します。 .

注: 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 HashMap cache = 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]

キーポイント

  • Circle と Rectangle は両方とも、オブジェクトはコードの正確さに影響を与えることなくサブタイプに置き換え可能であるべきであるというリスコフ置換原則 (SOLID 原則) に従っています
  • Shape オブジェクトの浅いコピーのみが作成されます。
リリースステートメント この記事は次の場所に転載されています: https://dev.to/prashantrmishra/prototype-15hn?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3