プロトタイプモード - 基本
基本的な導入
- プロトタイプモデル(プロトタイプモード)を指す:プロトタイプオブジェクトを使用して指定された種類のインスタンスを作成し、プロトタイプをコピーし、新しいオブジェクトを作成
- プロトタイプモデルが生成に関するデザインパターンは、オブジェクトを許可した後、作成する方法の詳細を知ることなく、他のカスタマイズされたオブジェクトを作成しています
- 動作原理は次のとおりです。プロトタイプオブジェクトによってオブジェクトに渡されたオブジェクトを起動するには、動員するために作成したプロトタイプオブジェクトのコピーを要求することにより、独自の創造を実現するために作成し、そのオブジェクトは).clone(あります
- 画像の理解:猿王の猿の毛は、他の日の物語を引き出し、引き出されました
図は原則構造を示しています
- プロトタイプ:プロトタイプクラス、クローニング独自のインタフェースを宣言する
- ConcretePrototype:プロトタイプ具象クラス実装することをクローン自身の操作
- クライアント:(同じ属性を)新しいオブジェクトを作成し、プロトタイプオブジェクトのクローン自身を作ります
//克隆该实例,使用默认的clone方法来完成
@Override
protected Object clone() {
Sheep sheep = null;
try {
sheep = (Sheep)super.clone();
} catch (Exception e) {
// TODO: handle exception
System.out.println(e.getMessage());
}
// TODO Auto-generated method stub
return sheep;
}
浅い対深いコピー
プレゼンテーションのシャローコピー
- データ型は、浅いコピーを新しいコピーに、直接オブジェクトの、すなわち属性値を値を転送し、基本データ型のメンバー変数です。
- データ・タイプのためのそのようなメンバ変数として参照データメンバ変数の型が配列、例えばクラスのようなオブジェクトであるので、浅いコピーを参照、つまり、メンバ変数(メモリアドレス)コピーの参考値を通過します新しいオブジェクトのための1つ。実際には二つのオブジェクトのメンバ変数は、同じインスタンスを指しているので。この場合、変形例でメンバ変数は、メンバ変数の値が別のオブジェクトへのオブジェクトに影響を与えます
- 以前、我々はクローン羊は浅いコピーであります
- 浅いコピーが達成羊=(シープ)super.clone()デフォルトのクローン()メソッドを使用しています。
基本的な導入深いコピー
- すべての基本データ型オブジェクトのメンバ変数の値をコピーします。
- 型アプリケーションのメモリ空間のすべてのメンバ変数の参照データ、及び各コピーの参照データ型のメンバー変数は、
オブジェクトが到達可能になるまで、すべてのオブジェクト量を参照しているオブジェクト。つまり、深いコピーの対象となる
オブジェクト全体をコピーします - ディープコピーの実装:ディープコピークローンを達成するためにオーバーライドメソッド
//深拷贝 - 方式 1 使用clone 方法
@Override
protected Object clone() throws CloneNotSupportedException {
Object deep = null;
//这里完成对基本数据类型(属性)和String的克隆
deep = super.clone();
//对引用类型的属性,进行单独处理
DeepProtoType deepProtoType = (DeepProtoType)deep;
deepProtoType.deepCloneableTarget = (DeepCloneableTarget)deepCloneableTarget.clone();
// TODO Auto-generated method stub
return deepProtoType;
}
- ディープコピー実装2:ディープコピーによって達成オブジェクト直列化(推奨)
//深拷贝 - 方式2 通过对象的序列化实现 (推荐)
public Object deepClone() {
//创建流对象
ByteArrayOutputStream bos = null;
ObjectOutputStream oos = null;
ByteArrayInputStream bis = null;
ObjectInputStream ois = null;
try {
//序列化
bos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(bos);
oos.writeObject(this); //当前这个对象以对象流的方式输出
//反序列化
bis = new ByteArrayInputStream(bos.toByteArray());
ois = new ObjectInputStream(bis);
DeepProtoType copyObj = (DeepProtoType)ois.readObject();
return copyObj;
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return null;
} finally {
//关闭流
try {
bos.close();
oos.close();
bis.close();
ois.close();
} catch (Exception e2) {
// TODO: handle exception
System.out.println(e2.getMessage());
}
}
}
Notesとプロトタイプモデルの詳細
Notesとプロトタイプモデルの詳細
- 新しい複合オブジェクトを作成する場合、プロトタイプモデルが向上することも可能オブジェクトを作成するプロセスを簡素化するために利用されてもよく、
効率を - オブジェクトを再初期化しますが、オブジェクトの実行時の状態に動的に取得しなければ
- 元のオブジェクトが変更された場合、それぞれの他のクローンは、オブジェクトが変更され、(増加または特性の減少)
コードを変更せず - 深いクローンを実装する場合、より複雑なコードが必要な場合があります
- 短所:各クラスの必要性はクローニング方法が装備され、この新しいクラスは難しくありませんが、持っている
クラスを変換するための時間を、あなたは、OCPの原則に反してそのソースコードを変更する必要があります。