プロトタイプモード-クリエイティブ

作成タイプ

1.シングルトンデザインパターン
2.ファクトリーデザインパターン
3.ビルダーデザインパターン
4.プロトタイプデザインパターン

構造タイプ

5.エージェンシーデザインパターン
6、ブリッジングデザインパターン
7、デコレーションデザインパターン
8、アダプターデザインパターン
9、アピアランスデザインパターン
10、フライウェイトデザインパターン
11、コンビネーションデザインパターン

行動

12.テンプレートデザインモード

前書き:

プロトタイプという言葉は、モデルにテンプレートインスタンスが必要であり、ユーザーがこのテンプレートオブジェクトから一貫した内部プロパティを持つオブジェクトをコピー(クローン)することを示します。コピーされたインスタンスはプロトタイプです。オブジェクトの作成コストが比較的大きく、同じクラスの異なるオブジェクト間の差がそれほど大きくない場合(ほとんどのフィールドが同じである場合)、この場合、既存のオブジェクト(プロトタイプ)を使用してコピー(またはコピー)できます。 )作成時間を節約するために新しいオブジェクトを作成します。プロトタイプに基づいてオブジェクトを作成するこの方法は、プロトタイプデザインパターン、または略してプロトタイプモードと呼ばれます。

アプリケーションシナリオ

1.クラスの初期化には多くのリソースが必要です。プロトタイプの複製によってオブジェクトを作成すると、これらのリソースの消費を回避できます。

2. newを使用してオブジェクトを作成するには、非常に面倒なデータ準備が必要です。これは、プロトタイプモードで使用できます。

3.クラスの異なるオブジェクト間にはほとんど違いがなく、ほとんどのフィールドは同じです。

成し遂げる

JavaScript言語に精通しているフロントエンドプログラマーにとって、プロトタイプモードは一般的な開発モードです。これは、Java、C ++、およびその他のクラスベースのオブジェクト指向プログラミング言語とは異なり、JavaScriptはプロトタイプベースのオブジェクト指向プログラミング言語であるためです。Java言語では、最も簡単な実装はclone()メソッドを呼び出すことです。

場合:

プロトタイプ

Book.classはプロトタイプであり、Bookオブジェクトをさらにコピーします。

import java.util.ArrayList;
import java.util.List;
import androidx.annotation.NonNull;

public class Book implements Cloneable{

    private String name;
    private ArrayList<String> mImages = new ArrayList<>();

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<String> getImages() {
        return mImages;
    }

    public void setImage(String image) {
        this.mImages.add(image);
    }

    public void showConten() {
        System.out.println("**************** Start **************");
        System.out.println("name: "+ this.name);

        for (String img : mImages) {
            System.out.println("image name: " + img);
        }
        System.out.println("**************** End **************");
    }

    @NonNull
    @Override
    protected Book clone() {
        try {
            Book book = (Book) super.clone();
            book.name = this.name;
            book.mImages = this.mImages;
            return book;
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return null;
    }
}

オブジェクトをコピーする

public class CloneBook {

    public static void main(String[] args) {
        Book book = new Book();
        book.setName("活法");
        book.setImage("图1");
        book.setImage("图2");

        book.showConten();

        Book book1 = book.clone();
        book1.setName("Android");
        book1.showConten();

        book.showConten();
    }
}

 実行:

****************開始**************
名前:活法
画像名:図1
画像名:図2
***** ************終了******************************
開始******* *******
名前:Android
画像名:図1
画像名:図2
****************終了************* *
****************開始**************
名前:活法
画像名:図1
画像名:図2
**** ************ 終わり **************
 

浅いコピーと深いコピー

プロトタイプモードを実装するには、ディープコピーとシャローコピーの2つの方法があります。浅いコピーまたは深いコピーのいずれかがプロトタイプモードの実現です。

浅いコピー:浅いコピーは、オブジェクト内の基本データタイプデータと参照オブジェクトのメモリアドレスのみをコピーし、参照オブジェクトと参照オブジェクトの参照オブジェクトを再帰的にコピーしません。

上記のBookオブジェクトのコピーは浅いコピーです。信じられない場合は試してみてください。コードは次のとおりです。

public class CloneBook {

    public static void main(String[] args) {
        Book book = new Book();
        book.setName("活法");
        book.setImage("图1");
        book.setImage("图2");

        book.showConten();

        Book book1 = book.clone();
        book1.setName("Android");
        book1.setImage("图3");//修改引用对象的数据
        book1.showConten();

        book.showConten();
    }
}

 動作結果:

****************開始**************
名前:活法
画像名:図1
画像名:図2
***** ************終了******************************
開始******* *******
名前:Android
画像名:図1
画像名:図2
画像名:図3
****************終了******** ******
****************開始**************
名前:活法
画像名:図1
画像名:図2
画像名:図3
****************終了**************

コピーされたオブジェクトbook1は、プロトタイプ内の参照オブジェクトのデータ(mImages)を変更し、その結果、bookオブジェクト内の参照オブジェクトのデータも変更されます。bookとbook1は、同時にmImagesの同じオブジェクトアドレスを指します。

ディープコピー:ディープコピーで取得できるのは、完全に独立したオブジェクトです。

Bookクラスのcloneメソッドを変更します

@NonNull
@Override
protected Book clone() {
     try {
         Book book = (Book) super.clone();
         book.name = this.name;
         book.mImages = (ArrayList<String>) this.mImages.clone();
         return book;
     } catch (CloneNotSupportedException e) {
         e.printStackTrace();
     }
     return null;
}

次のコードを再実行します

パブリッククラスCloneBook {

    public static void main(String [] args){         Book book = new Book();         book.setName( "活法");         book.setImage( "FIG1");         book.setImage( "FIG2");



        book.showConten();

        Book book1 = book.clone();
        book1.setName( "Android");
        book1.setImage( "FIG3"); //参照されるオブジェクトのデータを変更する
        book1.showConten();

        book.showConten();
    }
}

結果:book1は参照タイプオブジェクトのデータを変更し、bookには影響しません。これはディープコピーです。

**************** Start **************
name: 活法
image name: 图1
image name: 图2
**************** End **************
**************** Start **************
name: Android
image name: 图1
image name: 图2
image name: 图3
**************** End **************
**************** Start **************
name: 活法
image name: 图1
image name: 图2
**************** End **************

 

おすすめ

転載: blog.csdn.net/ezconn/article/details/106754096