[GO] J'ai écrit un modèle de conception dans l'édition Kotlin Prototype

Pour apprendre le concept d'interface et la réutilisabilité des objets, qui sont importants dans l'orientation des objets ["Introduction aux modèles de conception appris en langage Java"](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 & mots-clés = 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 J'ai appris à propos de% 85% A5% E9% 96% 80 & qid = 1559563427 & s = gateway & sr = 8-1) et j'ai décidé d'écrire en kotlin pendant que j'étais en Java. Cette fois, j'écrirai sur Prototype.

Qu'est-ce que le prototype

Un modèle qui utilise une classe lors de la création d'une instance, mais copie une instance existante et la duplique comme une autre instance.

Il y a des mérites dans les cas suivants.

  1. Lorsqu'il y a trop de types à rassembler dans une classe
  1. Lorsqu'il est difficile d'instancier à partir d'une classe
  2. Si vous souhaitez séparer le framework de l'instance générée

En outre, l'exemple de code fournit un modèle pour créer une nouvelle instance basée sur l'instance prototype.

Interface produit

Une instance d'une sous-classe qui hérite de la classe Product dans une interface qui hérite de Cloneable est la classe à copier.

Dans Kotlin, si Cloneable est implémenté dans l'interface du produit, ce sera java.lang.NoClassDefFoundError. Apparemment, il ne peut pas être implémenté dans une interface, et ce doit être une classe qui hérite de Cloneable. Nous avons également confirmé qu'il pouvait être implémenté dans le cas d'une sous-classe d'une classe abstraite qui hérite de Cloneable.

Référence: Modèle de conception avec le prototype Kotlin 06 Design Model-kotlin-Recovery Prototype

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
}

Pour la classe de résumé de produit

Product.kt


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

Classe de manager

C'est une classe qui duplique une instance en utilisant createClone, et si vous l'enregistrez, ce sera une classe qui peut être dupliquée à tout moment.

HashMap peut être obtenu avec showcase.get () ou showcase []. Dans kotlin, val a: String = null provoque une erreur de compilation et Null n'est pas autorisé par défaut. Si vous spécifiez ?, Null peut être géré. De plus, si le p spécifié est Null, createClone n'est pas exécuté et Null est renvoyé.

Référence: [Kotlin] [Java] Mémo de comparaison Kotlin Java [Null Safety] Kotlin Java Comparison Memo Correct Null Safety Usage Essayez «Introduction aux modèles de conception appris en langage Java» avec Kotlin (prototype)

@htsign Merci pour votre avis. À l'origine, je voulais déclarer une variable p de type Product en dehors du bloc de l'instruction try dans la sous-classe de Product J'ai assigné Null et spécifié?, Mais je l'ai modifié pour retarder l'initialisation en utilisant lateinit et je l'ai corrigé pour qu'il ne gère pas Null. Ainsi, createClone () de l'interface Product renvoie également la valeur de retour de Product? To Product.

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

Gestionnaire de correctifs.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()
    }
}

Classe MessageBox

Cette classe affiche une chaîne de caractères entourée d'une bordure. Le Cloneable mentionné précédemment doit être implémenté dans une sous-classe de Produit. De plus, puisque la méthode clone ne peut être appelée qu'à partir de votre propre classe (et sous-classe), si vous voulez dupliquer à la demande d'une autre classe (Manager), appelez clone avec une autre méthode telle que createClone (). Il est nécessaire.

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

MessageBox modifié.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 classe

Cette classe est affichée en soulignant la chaîne de caractères.

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

Stylo de soulignement fixe.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
    }
}

Classe principale

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.")
}

Échantillon de prototype modifié.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.")
}

Résultat d'exécution


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

Diagramme de classe

image.png

Impressions

J'ai également étudié pourquoi + clone est nécessaire en premier lieu (Référence: À propos de la méthode Java clone ()) Il a été hérité. J'ai appris que la méthode de clonage a été conçue pour copier l'instance telle quelle car elle se comporte involontairement lors de la création d'une instance dans une sous-classe ou autre.

référence

C'était très facile à lire et à comprendre en se référant à ce qui suit.

Comment écrire Java String # getBytes dans Kotlin? Modèle de conception avec le prototype Kotlin 06 Design Model-kotlin-Recovery Prototype [Kotlin] [Java] Mémo de comparaison Kotlin Java [Null Safety] Kotlin Java Comparison Memo Correct Null Safety Usage Essayez «Introduction aux modèles de conception appris en langage Java» avec Kotlin (prototype)

De plus, le blog suivant expliquait en détail clone (), qui était une excellente expérience d'apprentissage. À propos de la méthode Java clone ()

Recommended Posts

J'ai écrit un modèle de conception dans l'édition Kotlin Prototype
J'ai écrit un modèle de conception dans l'édition Kotlin Factory
J'ai écrit un modèle de conception dans l'édition Kotlin Builder
J'ai écrit un modèle de conception dans l'édition Kotlin Singleton
J'ai écrit un modèle de conception dans l'édition Kotlin Adapter
J'ai écrit un modèle de conception en kotlin, édité par Iterator
J'ai écrit un modèle de conception dans l'édition de modèle kotlin
Apprenez le modèle de conception "Prototype" avec Python
Un mémo que j'ai écrit un tri rapide en Python
J'ai écrit une classe en Python3 et Java
J'ai écrit un analyseur japonais en japonais en utilisant pyparsing.
Modèle de prototype en Java
J'ai écrit python en japonais
J'ai écrit un script pour obtenir un site populaire au Japon
J'ai écrit un script qui divise l'image en deux
J'obtiens un UnicodeDecodeError avec mecab-python3
J'obtiens une KeyError dans pyclustering.xmeans
J'ai écrit Gray Scale avec Pytorch
J'ai écrit la file d'attente en Python
J'ai écrit la pile en Python
J'ai étudié les modèles de conception (mémo personnel) Partie 3 (modèle de prototype, modèle de constructeur)
J'ai écrit une fonction pour charger le script d'extension Git en Python
J'ai écrit un script pour extraire les liens de pages Web en Python
J'ai écrit un code pour convertir quaternion en angle de graissage de type z-y-x avec Python
Je veux imprimer dans la notation d'inclusion
Apprenez le modèle de conception "Flyweight" en Python
Apprenez le modèle de conception "Memento" avec Python
Apprenez le modèle de conception "Proxy" en Python
Apprenez le modèle de conception "Commande" en Python
Apprenez le modèle de conception "Visiteur" avec Python
Apprenez le modèle de conception "Mediator" avec Python
Apprenez le modèle de conception "Décorateur" avec Python
[Gang of Four] Apprentissage des modèles de conception - Prototype
Tri sélect écrit en C
Apprenez le modèle de conception "Iterator" avec Python
[Python] J'ai écrit de force une courte fonction de génération de bruit parlin dans Numpy.
Apprenez le modèle de conception «Stratégie» avec Python
Apprenez le modèle de conception "Composite" avec Python
Apprenez le modèle de conception "État" en Python
J'ai écrit Project Euler 1 en une seule ligne.
Apprenez le modèle de conception "Adapter" avec Python
Démarrage de Node.js dans un environnement virtuel
J'ai créé un outil de mot de passe en Python.
J'ai écrit FizzBuzz en python en utilisant la machine à vecteurs de support (bibliothèque LIVSVM).
J'ai écrit l'aile coulissante dans la création.
J'ai écrit un graphe comme R glmnet en Python pour une modélisation clairsemée avec Lasso
[Examen d'ingénieur d'information de base] J'ai écrit un algorithme de recherche linéaire en Python.
J'ai écrit un module PyPI qui étend le style de paramètre dans le module sqlite3 de Python
Apprenez le modèle de conception "Abstract Factory" avec Python
Supprimer des données dans un modèle avec Redis Cluster
Apprenez le modèle de conception "Méthode de modèle" en Python
J'ai essayé de jouer à un jeu de frappe avec Python
Apprenez le modèle de conception "Méthode d'usine" en Python
J'ai écrit "Introduction à la vérification des effets" en Python
J'ai écrit un script pour télécharger un plug-in WordPress
J'ai essayé d'ajouter un module Python 3 en C
[PyTorch] J'étais un peu perdu dans torch.max ()
Créer un modèle d'antenne cadre en Python dans KiCad
J'ai créé un programme cryptographique César en Python.