ディレクトリ
起源プロトタイプ(試作品)モード
インスタンスを作成し、キーワードことができ、新たな創造を。しかし、時には、私たちは、次のような前提のクラス名を指定せずにインスタンスを作成する必要があります。
オブジェクトは、広い範囲に対処する必要があるクラス、クラスの数として、あまりにも多くの個別ならば、それは、単一のクラスに統合することができません。
コード例を通じて生成することが困難:コードが作成されている場合、たとえば、グラフィック描画ツールの例では、塗装、ユーザは、それは非常に困難です。私たちは、最初に必要な時間によって、保存することができますコピーするために生成されたインスタンスを。
私はデカップリングフレームをしたいとインスタンスを生成する場合:あなたは一例をコピーして新しいインスタンスを作成するために、プロトタイプのインスタンスをインスタンスを作成するクラス名を指定しますが、事前登録していません。プリンタなど、ドキュメント、ライン上にコピーするために必要な時間、何回も問題ありませんコピーの具体的な内容を知る必要はありません。
クラス図
コード
製品インタフェース、継承 Cloneableインタフェースは、実装クラスの製品インタフェースは、クローンインスタンスメソッドを使用してコピーすることができます。
使用方法は、サブクラスによって実装され、特定の使用方法、使用する方法を示しています。
createCloneは、コピーするための方法の一例です。
public interface Product extends Cloneable {
public abstract void use(String s);
public abstract Product createClone();
}
マネージャークラスはメソッドを作成し、オブジェクトのクラスを生成する必要があることは、クラスマネージャの複製されたインスタンスを呼び出すことができます
public class Manager {
private HashMap showcase = new HashMap();
public void register(String name, Product proto) {
showcase.put(name, proto);
}
public Product create(String protoname) {
Product p = (Product) showcase.get(protoname);
return p.createClone();
}
}
クラスの特定のオブジェクトをコピーするには
public class MessageBox implements Product {
private char decochar;
public MessageBox(char decochar) {
this.decochar = decochar;
}
@Override
public void use(String s) {
int length = s.getBytes().length;
for (int i = 0; i < length+4; i++) {
System.out.print(decochar);
}
System.out.println("");
System.out.println(decochar + " " + s + " " + decochar);
for (int i = 0; i < length+4; i++) {
System.out.print(decochar);
}
System.out.println("");
}
@Override
public Product createClone() {
Product p = null;
try {
p = (Product)clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return p;
}
}
public class UnderlinePen implements Product {
private char ulchar;
public UnderlinePen(char ulchar) {
this.ulchar = ulchar;
}
@Override
public void use(String s) {
int length = s.getBytes().length;
System.out.println("\"" + s + "\"");
System.out.print(" ");
for (int i = 0; i < length; i++) {
System.out.print(ulchar);
}
System.out.println("");
}
@Override
public Product createClone() {
Product p = null;
try {
p = (Product)clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return p;
}
}
使い方
public static void main(String[] args) {
Manager manager = new Manager();
UnderlinePen upen = new UnderlinePen('~');
MessageBox mbox = new MessageBox('*');
MessageBox sbox = new MessageBox('/');
manager.register("Strong Message", upen);
manager.register("Warning box", mbox);
manager.register("Slash box", sbox);
Product p1 = manager.create("Strong Message");
p1.use("hello");
Product p2 = manager.create("Warning box");
p2.use("hello");
Product p3 = manager.create("Slash box");
p3.use("hello");
}
//结果
"hello"
~~~~~
*********
* hello *
*********
/////////
/ hello /
/////////
役割
プロトタイプ(試作品)
この役割は、既存のインスタンスで定義された新しいメソッドのインスタンスをコピーするための責任があります。この実施形態は、製品のインターフェイスに対応します。
ConcretePrototype(具体的な試作品)
責任プロトタイプを達成する方法。なお、本実施形態とメッセージボックスに対応UnderlinePen
クライアント(ユーザー)
責任プロトタイプのインスタンスの新しいコピーを生成するための方法。
図モードクラス
私は理解して
说实话,由于经验所限,我不太能体会的到这个模式的好处。
看看示例代码:代码实现的功能类似于一个文本编辑器,可以对文本进行下划线(UnderlinePen)和提示(MessageBox)两个操作。在一篇文章里面,可能有很多很多个下划线和提示操作。每一个都创建对象,创建过程简单还好,复杂的话那代码量就太恐怖了。所以搞一个原型对象,用到了就复制就行了。
这只是我能理解的其中一个好处,更多内容可以看看这篇文章https://www.cnblogs.com/chenssy/p/3313339.html
另外原型模式涉及到了对象的深拷贝和浅拷贝。区别就在于:复制对象时,是否复制对象中的引用指向的内存。那篇文章里面有解释。