[GO] Ich habe ein Designmuster in der Kotlin Builder 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 Builder schreiben.

Was ist Builder?

Beim Erstellen einer Struktur handelt es sich um ein Muster zum Zusammenstellen einer Instanz mit einer Struktur, so wie es in jedem Schritt zusammengesetzt wird. Das Beispielprogramm behandelt eine Struktur, die Sätze genannt wird Unter der Annahme, dass der Text die folgenden Stufen und Strukturen aufweist, definieren wir die Methoden, aus denen jede Stufe besteht.

  1. Fügen Sie einen Titel hinzu
  1. Enthält einige Zeichenfolgen
  2. Enthält einige Aufzählungszeichen

Builder-Klasse

Eine Klasse, die Methoden zum Verfassen von Sätzen definiert.

Builder.java


abstract class Builder {
	public abstract void makeTitle(String title);
	public abstract void makeString(String str);
	public abstract void makeItems(String[] items);
	public abstract void close();
}

Builder.kt


abstract class Builder {
    abstract fun makeTitle(title: String)
    abstract fun makeString(str: String)
    abstract fun makeItems(items: Array<String>)
    abstract fun close()
}

Regieklasse

Diese Klasse implementiert die Konstruktmethode, um einen Satz zu konstruieren. Die Builder-Klasse wird im Konstruktor übergeben, aber da Builder eine abstrakte Klasse ist, ist die geerbte Unterklasse tatsächlich enthalten. Da es keine spezifische Unterklassendeklaration gibt, gibt es keine Abhängigkeiten. Darüber hinaus wird die Tatsache, dass Unterklassen ersetzt werden können, als Austauschbarkeit bezeichnet.

Director.java


class Director {
	private Builder builder;
	public Director(Builder builder) {
		this.builder = builder;
	}
	public void construct() {
		builder.makeTitle("Greeting");
		builder.makeString("Von morgens bis mittags");
		builder.makeItems(new String[] {
				"Guten Morgen.",
				"Hallo."
		});
		builder.makeString("Nachts");
		builder.makeItems(new String[] {
				"Guten Abend.",
				"Gute Nacht.",
				"Auf Wiedersehen."
		});
		builder.close();
	}
}

Director.kt


class Director(builder: Builder) {
    private var b = builder
    fun construct(){
        b.makeTitle("Greeting")
        b.makeString("Von morgens bis mittags")
        b.makeItems(arrayOf("Guten Morgen.", "Hallo."))
        b.makeString("Nachts")
        b.makeItems(arrayOf("Guten Abend.", "Gute Nacht.", "Auf Wiedersehen."))
        b.close()
    }
}

TextBuilder-Klasse

Eine Klasse, die Dokumente mit einfachem Text erstellt.

Als ich die for-Anweisung in kotlin schrieb, schrieb ich zuerst for (i: Int in 0..items.size -1), aber Wie for (i: Int in 0 bis items.size) zählt till die Anzahl der Brüche nicht, ist also für Array-Operationen geeignet.

Hinweis: Android-Entwicklung mit Kotlin! Halten wir die grundlegende Syntax gedrückt

Mit kotlin können Sie eine bequeme Methode namens "String Template" (String-Interpolation) schreiben. Sie können eine Zeichenfolge wie "println (" $ a + $ b = $ {a + b} ") // 2 + 3 = 5" einbetten.

Referenz: Was Java-Programmierer mit Kotlin nützlich finden

TextBuilder.java


class TextBuilder extends Builder{
	private StringBuffer buffer = new StringBuffer();
	public void makeTitle(String title) {
		buffer.append("================================================\n");
		buffer.append(String.format("[%s]\n", title));
		buffer.append("\n");
	}
	public void makeString(String str) {
		buffer.append(String.format("■%s\n", str));
		buffer.append("\n");
	}
	public void makeItems(String[] items) {
		for (int i = 0; i < items.length; i++) {
			buffer.append(String.format("・%s\n", items[i]));
		}
		buffer.append("\n");
	}
	public void close() {
		buffer.append("================================================\n");
	}
	public String getResult() {
		return buffer.toString();
	}
}

TextBuilder.kt


class TextBuilder: Builder() {
    private var buffer = StringBuffer()
    override fun makeTitle(title: String) {
        buffer.append("================================================\n")
        buffer.append("[$title]\n")
        buffer.append("\n")
    }
    override fun makeString(str: String) {
        buffer.append("■$str\n")
        buffer.append("\n")
    }
    override fun makeItems(items: Array<String>) {
        for (i: Int in 0 until items.size) buffer.append("・${items[i]}\n")
        buffer.append("\n")
    }
    override fun close() {
        buffer.append("================================================\n")
    }
    fun getResult() = buffer.toString()
}

HTMLBuilder-Klasse

Eine Klasse, die Dokumente mithilfe von HTML-Dateien erstellt.

Ich hatte Probleme beim Initialisieren des Writer-Mitglieds mit der File-Klasse, aber ich habe gehört, dass Sie lateinit verwenden können, um den Wert zu verzögern, der sich im Verlauf des Prozesses ändert. Außerdem wird lateinit als "privat" empfohlen, da es schwierig ist, von außen darauf zuzugreifen, bevor es initialisiert wird.

Referenz: [Initialisierung mit Kotlin verzögern](https://re-engines.com/2018/11/15/Verzögerung mit kotlin / verzögern)

Sie können den printWriter mit java.io.File # printWriter () abrufen. Er wird erstellt, wenn die Datei nicht vorhanden ist, und überschrieben, wenn er vorhanden ist. Wenn Sie es hinzufügen möchten, verwenden Sie appendText ().

Referenz: E / A (Datei, Netzwerk usw.)

Wenn Sie das Verhalten abhängig von der Existenz der Datei ändern möchten, verwenden Sie java.io.File # createNewFile (): Boolean.

Referenz: Kotlin - Datei erstellen - Beispiele

HTMLBuilder.java


import java.io.*;

class HTMLBuilder extends Builder{
	private String filename;
	private PrintWriter writer;
	public void makeTitle(String title) {
		filename = title + ".html";
		try {
			writer = new PrintWriter(filename);
		} catch (IOException e) {
			e.printStackTrace();
		}
		writer.println(String.format("<html><head><title>%s</title></head><body>", title));
		writer.println(String.format("<h1>%s</h1>", title));
	}
	public void makeString(String str) {
		writer.println(String.format("<p>%s</p>", str));
	}
	public void makeItems(String[] items) {
		writer.println("<ul>");
		for (int i = 0; i < items.length; i++) {
			writer.println(String.format("<li>%s</li>", items[i]));
		}
		writer.println("</ul>");
	}
	public void close() {
		writer.println("</body></html>");
		writer.close();
	}
	public String getResult() {
		return filename;
	}
}

HTMLBuilder.kt


import java.io.File

class HTMLBuilder: Builder() {
    private var filename = String()
    private lateinit var writer:File
    override fun makeTitle(title: String) {
        filename = "$title.html"
        writer = File(filename)
        writer.printWriter().use { it.println("<html><head><title>$filename</title></head><body>") }
        writer.appendText("<h1>$title</h1>\n")
    }
    override fun makeString(str: String) {
        writer.appendText("<p>$str</p>\n")
    }
    override fun makeItems(items: Array<String>) {
        writer.appendText("<ul>\n")
        for (i: Int in 0 until items.size) writer.appendText("<li>${items[i]}</li>\n")
        writer.appendText("</ul>\n")
    }
    override fun close() {
        writer.appendText("</body></html>\n")
    }
    fun getResult() = filename
}

Hauptklasse

BuilderSample.java


public class BuilderSample {
	public static void main(String[] args) {
		if (args.length != 1) {
			usage();
			System.exit(0);
		}
		if (args[0].equals("plain")) {
			TextBuilder textbuilder = new TextBuilder();
			Director director = new Director(textbuilder);
			director.construct();
			String result = textbuilder.getResult();
			System.out.println(result);
		} else if (args[0].equals("html")) {
			HTMLBuilder htmlbuilder = new HTMLBuilder();
			Director director = new Director(htmlbuilder);
			director.construct();
			String filename = htmlbuilder.getResult();
			System.out.println(String.format("%s wurde erstellt.", filename));
		} else {
			usage();
			System.exit(0);
		}
	}
	public static void usage() {
		System.out.println("Usage:Java Main Plain Dokumenterstellung mit Klartext");
		System.out.println("Usage:Java Main HTML Dokumenterstellung mit HTML-Datei");
	}
}

BuilderSample.kt


fun main(args: Array<String>) {
    if (args.size != 1){
        usage()
        System.exit(0)
    }
    if (args[0] == "plain"){
        val textbuilder = TextBuilder()
        val director = Director(textbuilder)
        director.construct()
        val result = textbuilder.getResult()
        println(result)
    } else if (args[0] == "html") {
        val htmlbuilder = HTMLBuilder()
        val director = Director(htmlbuilder)
        director.construct()
        val filename = htmlbuilder.getResult()
        println(filename)
    } else {
        usage()
        System.exit(0)
    }

}
fun usage() {
    println("Usage:Java Main Plain Dokumenterstellung mit Klartext")
    println("Usage:Java Main HTML Dokumenterstellung mit HTML-Datei")
}

einfaches Ausführungsergebnis


================================================
[Greeting]

■ Von morgens bis mittags

·Guten Morgen.
·Hallo.

■ Nachts

·Guten Abend.
·Gute Nacht.
·Auf Wiedersehen.

================================================

Ergebnis der HTML-Ausführung


Greeting.HTML wurde erstellt.

Greeting.html


<html><head><title>Greeting</title></head><body>
<h1>Greeting</h1>
<p>Von morgens bis mittags</p>
<ul>
<li>Guten Morgen.</li>
<li>Hallo.</li>
</ul>
<p>Nachts</p>
<ul>
<li>Guten Abend.</li>
<li>Gute Nacht.</li>
<li>Auf Wiedersehen.</li>
</ul>
</body></html>

Klassen Diagramm

image.png

Impressionen

  1. In kotlin wird String # equals durch == dargestellt, und ich habe gelernt, equals intern auszuführen und === zu verwenden, wenn ich Referenzen vergleichen möchte.
  2. Ich habe gelernt, dass till, bei dem die Anzahl der Brüche nicht berücksichtigt wird, geeignet ist, wenn eine Sammlung wie Array in einer for-Anweisung verwendet wird.
  3. Ich habe auch etwas über String Template (String Interpolation), Delay Evaluation und java.io.File # printWriter () gelernt.

Referenz

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

Kotlin – Create File – Examples Android-Entwicklung mit Kotlin! Halten wir die grundlegende Syntax gedrückt Was Java-Programmierer mit Kotlin nützlich finden [Initialisierung mit Kotlin verzögern](https://re-engines.com/2018/11/15/Verzögerung mit kotlin / verzögern) E / A (Datei, Netzwerk usw.) Kotlin - toString, equals, hashCode

Recommended Posts

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
Ich habe ein Designmuster in der Kotlin Prototype Edition geschrieben
Lernen Sie das Entwurfsmuster "Builder" mit Python
Entwurfsmuster #Builder
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.
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 ü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 Fizz Buzz in Python geschrieben
Ich habe Gray Scale mit Pytorch geschrieben
Ich habe ein Skript geschrieben, um Webseiten-Links in Python zu extrahieren
Ich habe die Warteschlange in Python geschrieben
Ich habe an AtCoder teilgenommen (ABC169 Edition)
Ich habe den Stack in Python geschrieben
Ich habe einen Code geschrieben, um die Quaternion mit Python in einen Ölerwinkel vom Typ z-y-x umzuwandeln
[Python] Ich habe gewaltsam eine kurze Funktion zur Erzeugung von Parlin-Geräuschen in Numpy geschrieben.
Ich habe FizzBuzz in Python mit der Support Vector Machine (Bibliothek LIVSVM) geschrieben.
Ich möchte in der Einschlussnotation drucken
Lernen Sie das Designmuster "Flyweight" in Python
Ich habe ein Pay-Management-Programm in Python erstellt!
Lernen Sie das Entwurfsmuster "Observer" in Python
Lernen Sie das Entwurfsmuster "Memento" mit Python
Lernen Sie das Entwurfsmuster "Proxy" in Python
Lernen Sie das Entwurfsmuster "Besucher" mit Python
Lernen Sie das Entwurfsmuster "Bridge" mit Python
Lernen Sie das Entwurfsmuster "Mediator" mit Python
Lernen Sie das Designmuster "Decorator" mit Python
Schriftliche Auswahlsortierung in C.
Lernen Sie das Entwurfsmuster "Iterator" mit Python
[Viererbande] Design Pattern Learning - Builder
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 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
Ich habe ein PyPI-Modul geschrieben, das den Parameterstil in Pythons sqlite3-Modul erweitert
Wenn ich einen Chrom-Treiberfehler in Selenium bekomme
Lernen Sie das Entwurfsmuster "Abstract Factory" mit Python
Lernen Sie das Entwurfsmuster "Vorlagenmethode" in Python
Ich möchte mit Python ein Fenster erstellen
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