[JAVA] Prototypmuster

Protytype-Muster

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.

Die Rolle des Prototyps

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();
}

Die Rolle des konkreten Prototyps

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;
	}
}

Die Rolle des Kunden (Benutzers)

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();
	}
}

Anrufer

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 /
// ////////////////

Warum brauchen Sie Prototyp

Wenn Sie eine Instanz erstellen möchten, können Sie einfach new Something () verwenden. In den folgenden Fällen ist dies jedoch effektiv.

Wenn es zu viele Typen gibt, um sie in einer Klasse zusammenzustellen

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 es schwierig ist, aus einer Klasse zu instanziieren

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.

Wenn Sie das Framework von der generierten Instanz trennen möchten

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

Prototypmuster
Prototypmuster
Entwurfsmuster ~ Prototyp ~
Erinnerungsmuster
Vermittlermuster
Iteratormuster
Zusammengesetztes Muster
Beobachtermuster
Builder-Muster
Brückenmuster
Befehlsmuster
Builder-Muster
Strategiemuster
Iteratormuster
Besuchermuster
Adaptermuster
Proxy-Muster
Strategiemuster
Zusammengesetztes Muster
Singleton-Muster
Singleton-Muster
Fassadenmuster
Dekorationsmuster
Fliegengewichtsmuster
Dekorateur Muster
Vermittlermuster
Fassadenmuster
Besuchermuster
Brückenmuster
abstraktes Fabrikmuster
Entwurfsmuster ~ Builder ~
[Java] Strategiemuster
Entwurfsmuster ~ Besucher ~
Java-Entwurfsmuster
Java-Rückrufmuster
Entwurfsmuster ~ Proxy ~
Entwurfsmuster ~ Zustand ~
Factory Method Pattern
Entwurfsmuster ~ Strategie ~
Entwurfsmuster ~ Singleton ~
Entwurfsmuster ~ Composite ~
Entwurfsmuster (2): Builder
Entwurfsmuster (1): AbstractFactory
[Java] Singleton-Muster
Entwurfsmuster ~ Befehl ~
Abstraktes Fabrikmuster
Entwurfsmuster ~ Iterator ~
Entwurfsmuster ~ Fassade ~
Entwurfsmuster ~ Brücke ~
Entwurfsmuster ~ Mediator ~
Muster der Vorlagenmethode
Entwurfsmuster ~ Dekorateur ~
Muster der Vorlagenmethode
Entwurfsmuster ~ Interpreter ~
Factory Method Muster
Entwurfsmuster ~ Beobachter ~
[Java] Adaptermuster
Entwurfsmuster ~ Memento ~
Entwurfsmuster ~ Adapter ~
Entwurfsmuster ~ Fliegengewicht ~
Java-Muster-Memo