[GO] Ich habe ein Designmuster in der Kotlin Prototype Edition geschrieben

Erlernen des Konzepts der Schnittstelle und der Wiederverwendbarkeit von Objekten, die für die Objektorientierung wichtig sind ["Einführung in in Java-Sprache erlernte Entwurfsmuster"](https://www.amazon.co.jp/%E5%A2%97% E8% A3% 9C% E6% 94% B9% E8% A8% 82% E7% 89% 88Java% E8% A8% 80% E8% AA% 9E% E3% 81% A7% E5% AD% A6% E3% 81% B6% E3% 83% 87% E3% 82% B6% E3% 82% A4% E3% 83% B3% E3% 83% 91% E3% 82% BF% E3% 83% BC% E3% 83% B3% E5% 85% A5% E9% 96% 80-% E7% B5% 90% E5% 9F% 8E-% E6% B5% A9 / dp / 4797327030 / ref = sr_1_1? __Mk_ja_JP =% E3% 82% AB % E3% 82% BF% E3% 82% AB% E3% 83% 8A & Schlüsselwörter = Java% E8% A8% 80% E8% AA% 9E% E3% 81% A7% E5% AD% A6% E3% 81% B6 % E3% 83% 87% E3% 82% B6% E3% 82% A4% E3% 83% B3% E3% 83% 91% E3% 82% BF% E3% 83% BC% E3% 83% B3% E5 Ich habe% 85% A5% E9% 96% 80 & qid = 1559563427 & s = gateway & sr = 8-1) kennengelernt und mich entschieden, in Kotlin zu schreiben, während ich in Java war. Dieses Mal werde ich über Prototype schreiben.

Was ist ein Prototyp?

Beim Erstellen einer Instanz basiert sie auf der Klasse, jedoch auf einem Muster, das eine vorhandene Instanz kopiert und als andere Instanz dupliziert.

In den folgenden Fällen gibt es Vorteile.

  1. Wenn es zu viele Typen gibt, um sie in einer Klasse zusammenzustellen
  1. Wenn es schwierig ist, aus einer Klasse zu instanziieren
  2. Wenn Sie das Framework von der generierten Instanz trennen möchten

Darüber hinaus enthält der Beispielcode ein Muster zum Erstellen einer neuen Instanz basierend auf der Prototypinstanz.

Produktschnittstelle

Eine Instanz einer Unterklasse, die die Produktklasse in einer Schnittstelle erbt, die Cloneable erbt, ist die zu kopierende Klasse.

Wenn in Kotlin Cloneable in der Produktschnittstelle implementiert ist, lautet es "java.lang.NoClassDefFoundError". Anscheinend kann es nicht in einer Schnittstelle implementiert werden, und es muss eine Klasse sein, die Cloneable erbt. Wir haben auch bestätigt, dass es im Fall einer Unterklasse einer abstrakten Klasse implementiert werden kann, die Cloneable erbt.

Referenz: Entwurfsmuster mit Kotlin-Prototyp 06 Design Model-Kotlin-Recovery-Prototyp

Product.java


interface Product extends Cloneable {
	public abstract void use(String s);
	public abstract Product createClone();
}

Product.kt


interface Product {
    fun use(s: String)
    fun createClone(): Product
}

Für Produkt abstrakte Klasse

Product.kt


abstract class Product(): Cloneable {
    abstract fun use(s: String)
    abstract fun createClone(): Product
}

Manager-Klasse

Es ist eine Klasse, die eine Instanz mit createClone dupliziert. Wenn Sie sie registrieren, handelt es sich um eine Klasse, die jederzeit dupliziert werden kann.

HashMap kann entweder mit "template.get ()" oder "template []" abgerufen werden. In kotlin verursacht val a: String = null einen Kompilierungsfehler, und Null ist standardmäßig nicht zulässig. Wenn Sie? Angeben, kann Null behandelt werden. Wenn das angegebene p Null ist, wird createClone nicht ausgeführt und Null zurückgegeben.

Referenz: [Kotlin] [Java] Kotlin Java-Vergleichsnotiz [Null-Sicherheit] Kotlin Java-Vergleichsnotiz Korrekte Verwendung der Null-Sicherheit Versuchen Sie "Einführung in in Java-Sprache erlernte Entwurfsmuster" mit Kotlin (Prototyp)

@htsign Vielen Dank für Ihre Bewertung. Ursprünglich wollte ich eine Variable p vom Typ Product außerhalb des Blocks der try-Anweisung in der Unterklasse von Product deklarieren Ich habe "Null" zugewiesen und "?" Angegeben, aber ich habe es geändert, um die Initialisierung mit "lateinit" zu verzögern, und es so korrigiert, dass es nicht mit Null umgehen kann. Das "createClone ()" der "Product" -Schnittstelle gibt also auch den Rückgabewert von "Product?" Zu "Product" zurück.

Manager.java


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

Manager.kt


class Manager {
    private var showcase: MutableMap<String, Product> = mutableMapOf()
    fun register(name: String, proto: Product){
        showcase.put(name, proto)
    }
    fun create(protoname: String): Product?{
        val p = showcase[protoname] as Product
        return p?.createClone()
    }
}

Fix Manager.kt


class Manager {
    private var showcase: MutableMap<String, Product> = mutableMapOf()
    fun register(name: String, proto: Product){
        showcase.put(name, proto)
    }
    fun create(protoname: String): Product{
        val p = showcase[protoname] as Product
        return p.createClone()
    }
}

MessageBox-Klasse

Diese Klasse zeigt eine Zeichenfolge an, die von einem Rahmen umgeben ist. Das zuvor erwähnte Klonbare muss in einer Unterklasse von Produkt implementiert werden. Da die Klonmethode nur von Ihrer eigenen Klasse (und Unterklasse) aufgerufen werden kann, rufen Sie den Klon mit einer anderen Methode wie "createClone ()" auf, wenn Sie auf Anforderung einer anderen Klasse (Manager) duplizieren möchten. Es ist notwendig.

MessageBox.java


class MessageBox implements Product {
	private char decochar;
	public MessageBox(char decochar) {
		this.decochar = decochar;
	}
	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(String.format("%s %s %s", decochar, s, decochar));
		for (int i = 0; i < length + 4; i++) {
			System.out.print(decochar);
		}
		System.out.println("");
	}
	public Product createClone(){
		Product p = null;
		try {
			p = (Product)clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return p;
	}
}

MessageBox.kt


class MessageBox(private val d: Char): Product, Cloneable{
    override fun use(s: String){
        val length = s.toByteArray().size
        for (i: Int in 1..length + 4) print(d)
        println("")
        println("%s %s %s".format(d, s, d))
        for (i: Int in 1..length + 4) print(d)
        println("")
    }
    override fun createClone(): Product?{
        var p: Product? = null
        try {
            p = clone() as Product
        }catch (e:CloneNotSupportedException){
            e.printStackTrace()
        }
        return p
    }
}

Geänderte MessageBox.kt


class MessageBox(private val d: Char): Product, Cloneable{
    override fun use(s: String){
        val length = s.toByteArray().size
        for (i: Int in 1..length + 4) print(d)
        println("")
        println("%s %s %s".format(d, s, d))
        for (i: Int in 1..length + 4) print(d)
        println("")
    }
    override fun createClone(): Product{
        lateinit var p: Product
        try {
            p = clone() as Product
        }catch (e:CloneNotSupportedException){
            e.printStackTrace()
        }
        return p
    }
}

UnderlinePen-Klasse

Diese Klasse wird durch Unterstreichen der Zeichenfolge angezeigt.

UnderlinePen.java


class UnderlinePen implements Product {
	private char ulchar;
	public UnderlinePen(char ulchar) {
		this.ulchar = ulchar;
	}
	public void use(String s) {
		int length = s.getBytes().length;
		System.out.println(String.format("\"%s\"", s));
		System.out.print(" ");
		for (int i = 0; i < length; i++) {
			System.out.print(ulchar);
		}
		System.out.println("");
	}
	public Product createClone() {
		Product p = null;
		try {
			p = (Product)clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return p;
	}
}

UnderlinePen.kt


class UnderLinePen(ulchar: Char): Product, Cloneable{
    private val u = ulchar
    override fun use(s: String) {
        val length = s.toByteArray().size
        println("\"%s\"".format(s))
        print(" ")
        for (i: Int in 1..length) print(u)
        println("")
    }

    override fun createClone(): Product? {
        var p: Product? = null
        try {
            p = clone() as Product
        }catch (e: CloneNotSupportedException){
            e.printStackTrace()
        }
        return p
    }
}

Fixed Underline Pen.kt


class UnderLinePen(ulchar: Char): Product, Cloneable{
    private val u = ulchar
    override fun use(s: String) {
        val length = s.toByteArray().size
        println("\"%s\"".format(s))
        print(" ")
        for (i: Int in 1..length) print(u)
        println("")
    }

    override fun createClone(): Product {
        lateinit var p: Product
        try {
            p = clone() as Product
        }catch (e: CloneNotSupportedException){
            e.printStackTrace()
        }
        return p
    }
}

Hauptklasse

PrototypeSample.java


public class PrototypeSample {
	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");
		Product p2 = manager.create("warning box");
		Product p3 = manager.create("slash box");
		p1.use("Hello, World.");
		p2.use("Hello, World.");
		p3.use("Hello, World.");
	}
}

PrototypeSample.kt


fun main(args: Array<String>) {
    val manager = Manager()
    val upen = UnderLinePen('~')
    val mbox = MessageBox('*')
    val sbox = MessageBox('/')
    manager.register("strong message", upen)
    manager.register("warning box", mbox)
    manager.register("slash box", sbox)

    val p1 = manager.create("strong message")
    val p2 = manager.create("warning box")
    val p3 = manager.create("slash box")
    p1?.use("Hellow, World.")
    p2?.use("Hellow, World.")
    p3?.use("Hellow, World.")
}

Modifiziertes Prototyp-Beispiel.kt


fun main(args: Array<String>) {
    val manager = Manager()
    val upen = UnderLinePen('~')
    val mbox = MessageBox('*')
    val sbox = MessageBox('/')
    manager.register("strong message", upen)
    manager.register("warning box", mbox)
    manager.register("slash box", sbox)

    val p1 = manager.create("strong message")
    val p2 = manager.create("warning box")
    val p3 = manager.create("slash box")
    p1.use("Hellow, World.")
    p2.use("Hellow, World.")
    p3.use("Hellow, World.")
}

Ausführungsergebnis


   "Hello, World."
    ~~~~~~~~~~~~~
   *****************
   * Hello, World. *
   *****************
   /////////////////
   / Hello, World. /
   /////////////////

Klassen Diagramm

image.png

Impressionen

Ich habe auch untersucht, warum + Klon überhaupt notwendig ist (Referenz: Über die Java-Methode clone ()) Ich habe erfahren, dass die Klonmethode so konzipiert wurde, dass die Instanz so kopiert wird, wie sie ist, da sie sich beim Erstellen einer Instanz in einer Unterklasse oder dergleichen unbeabsichtigt verhält.

Referenz

Es war sehr leicht zu lesen und zu verstehen, wenn man sich auf Folgendes bezog.

Wie schreibe ich Java String # getBytes in Kotlin? Entwurfsmuster mit Kotlin-Prototyp 06 Design Model-Kotlin-Recovery-Prototyp [Kotlin] [Java] Kotlin Java-Vergleichsnotiz [Null-Sicherheit] Kotlin Java-Vergleichsnotiz Korrekte Verwendung der Null-Sicherheit Versuchen Sie "Einführung in in Java-Sprache erlernte Entwurfsmuster" mit Kotlin (Prototyp)

Außerdem erklärte der folgende Blog ausführlich über "clone ()", was eine großartige Lernerfahrung war. Informationen zur Java-Methode clone ()

Recommended Posts

Ich habe ein Designmuster in der Kotlin Prototype Edition geschrieben
Ich habe ein Designmuster in der Kotlin Factory Edition geschrieben
Ich habe ein Designmuster in der Kotlin Builder Edition geschrieben
Ich habe ein Designmuster in der Kotlin Singleton Edition geschrieben
Ich habe ein Designmuster in der Kotlin Adapter Edition geschrieben
Ich habe ein Designmuster in Kotlin geschrieben, das von Iterator bearbeitet wurde
Ich habe ein Designmuster in der Kotlin Template Edition geschrieben
Lernen Sie das Entwurfsmuster "Prototype" mit Python
Ein Memo, das ich schnell in Python geschrieben habe
Ich habe eine Klasse in Python3 und Java geschrieben
Ich habe einen japanischen Parser auf Japanisch mit Pyparsing geschrieben.
Prototypmuster in Java
Ich habe Python auf Japanisch geschrieben
Ich habe ein Skript geschrieben, um eine beliebte Seite in Japan zu bekommen
Ich habe ein Skript geschrieben, das das Bild in zwei Teile teilt
Ich bekomme einen UnicodeDecodeError mit mecab-python3
Ich erhalte einen KeyError in pyclustering.xmeans
Ich habe Gray Scale mit Pytorch geschrieben
Ich habe die Warteschlange in Python geschrieben
Ich habe den Stack in Python geschrieben
Ich habe über Designmuster (persönliches Memo) Teil 3 (Prototypmuster, Builder-Muster) studiert.
Ich habe eine Funktion zum Laden des Git-Erweiterungsskripts in Python geschrieben
Ich habe ein Skript geschrieben, um Webseiten-Links in Python zu extrahieren
Ich habe einen Code geschrieben, um die Quaternion mit Python in einen Ölerwinkel vom Typ z-y-x umzuwandeln
Ich möchte in der Einschlussnotation drucken
Lernen Sie das Designmuster "Flyweight" in Python
Lernen Sie das Entwurfsmuster "Memento" mit Python
Lernen Sie das Entwurfsmuster "Proxy" in Python
Lernen Sie das Entwurfsmuster "Befehl" in Python
Lernen Sie das Entwurfsmuster "Besucher" mit Python
Lernen Sie das Entwurfsmuster "Mediator" mit Python
Lernen Sie das Designmuster "Decorator" mit Python
[Viererbande] Designmuster lernen - Prototyp
Schriftliche Auswahlsortierung in C.
Lernen Sie das Entwurfsmuster "Iterator" mit Python
[Python] Ich habe gewaltsam eine kurze Funktion zur Erzeugung von Parlin-Geräuschen in Numpy geschrieben.
Lernen Sie das Entwurfsmuster "Strategie" mit Python
Lernen Sie das Entwurfsmuster "Composite" mit Python
Lernen Sie das Entwurfsmuster "State" in Python
Ich habe Project Euler 1 in einem Liner geschrieben.
Lernen Sie das Entwurfsmuster "Adapter" mit Python
Startete Node.js in einer virtuellen Umgebung
Ich habe ein Passwort-Tool in Python erstellt.
Ich habe FizzBuzz in Python mit der Support Vector Machine (Bibliothek LIVSVM) geschrieben.
Ich habe den Gleitflügel in der Schöpfung geschrieben.
Ich habe ein Diagramm wie R glmnet in Python für die spärliche Modellierung mit Lasso geschrieben
[Basic Information Engineer Examination] Ich habe einen linearen Suchalgorithmus in Python geschrieben.
Ich habe ein PyPI-Modul geschrieben, das den Parameterstil in Pythons sqlite3-Modul erweitert
Lernen Sie das Entwurfsmuster "Abstract Factory" mit Python
Löschen Sie Daten in einem Muster mit Redis Cluster
Lernen Sie das Entwurfsmuster "Vorlagenmethode" in Python
Ich habe versucht, mit Python ein Tippspiel zu spielen
Lernen Sie das Entwurfsmuster "Factory Method" in Python
Geschrieben "Einführung in die Effektüberprüfung" in Python
Ich habe ein Skript geschrieben, um ein WordPress-Plug-In hochzuladen
Ich habe versucht, ein Python 3-Modul in C hinzuzufügen
[PyTorch] Ich war ein wenig verloren in torch.max ()
Erstellen Sie in KiCad ein Rahmenantennenmuster in Python
Ich habe ein Caesar-Kryptografieprogramm in Python erstellt.