Anstatt eine Instanz aus einer Klasse zu erstellen, erstellen Sie eine andere Instanz aus einer. Erstellen Sie eine neue Instanz basierend auf dem Prototyp und der Modellinstanz.
Definieren Sie eine Methode zum Kopieren einer Instanz und zum Erstellen einer neuen.
package framework;
public interface Product extends Cloneable {
//Methode zum "Verwenden". Es liegt an der Unterklassenimplementierung, sie zu verwenden, aber was sie bedeutet
public abstract void use(String s);
//Duplizieren Sie die Instanz
public abstract Product createClone();
}
Implementieren Sie tatsächlich die Methode, die die Instanz kopiert und eine neue Instanz erstellt.
import framework.Product;
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;
}
}
import framework.Product;
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;
}
}
Erstellen Sie eine neue Instanz mit der Methode, mit der die Instanz kopiert wird.
package framework;
import java.util.HashMap;
/**
*Eine Klasse, die eine Instanz über die Produktschnittstelle dupliziert
*/
public class Manager {
private HashMap<String, Product> showcase = new HashMap<>();
public void register(String name, Product proto) {
showcase.put(name, proto);
}
public Product create(String protoname) {
Product p = showcase.get(protoname);
return p.createClone();
}
}
import framework.Manager;
import framework.Product;
public class Main {
public static void main(String[] args) {
//Vorbereitung
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);
//Generieren
Product p1 = manager.create("strong message");
p1.use("Hello, world");
Product p2 = manager.create("warning box");
p2.use("Hello, world");
Product p3 = manager.create("slash box");
p3.use("Hello, world");
}
}
// "Hello, world"
// ~~~~~~~~~~~~
// ****************
// * Hello, world *
// ****************
// ////////////////
// / Hello, world /
// ////////////////
Wenn Sie eine Instanz erstellen möchten, können Sie einfach new Something () verwenden. In den folgenden Fällen ist dies jedoch effektiv.
In diesem Programm sind drei Modelle erschienen. Was verwendet '~', um eine Zeichenfolge zu unterstreichen Verwenden Sie '*', um einen String zu rahmen Verwenden Sie '/', um eine Zeichenfolge zu rahmen
Da dieses Beispiel einfach ist, gibt es drei Vorlagen, aber Sie können so viele Typen erstellen, wie Sie möchten. Wenn Sie sie alle in separate Klassen einteilen, ist die Anzahl der Klassen zu groß und es ist schwierig, die Quelle zu verwalten.
Wenn Sie dieselbe Instanz erstellen möchten, die die vom Benutzer erstellte Figur darstellt, ist es einfacher, die Instanz zu kopieren, als die Klasse zu verwenden.
Im Beispielprogramm ist der Teil, der die Instanz kopiert (Klon), im Framework-Paket beschränkt. In der create-Methode der Manager-Klasse wird anstelle des Klassennamens eine Zeichenfolge wie "strong message" als Name für die Instanziierung angegeben. Man kann sagen, dass dies das neue Something () - Format, das der von der Java-Sprache bereitgestellte Instanziierungsmechanismus ist, allgemeiner macht und das Framework von der Bindung von Klassennamen trennt.
Recommended Posts