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

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 Factory.

Qu'est-ce que l'usine

Modèle de modèle est conçu pour que la superclasse définisse le cadre de traitement (traitement partagé similaire) et la sous-classe définit le contenu spécifique. Bien qu'il s'agisse d'un modèle, c'est un modèle de conception qui définit le cadre de l'instanciation. Ce qui suit implémentera le cadre de création d'instances et la sous-classe qui "crée une carte d'identité (instance)".

Classe de produit

Cette classe est une classe abstraite qui définit le «produit», et la méthode d'utilisation est définie en partant du principe que le produit est «utilisé». De plus, l'abstraction peut la forcer à être «utilisée» comme un rôle de produit. (J'ai ressenti l'intention.)

Dans kotlin, même si vous ne spécifiez pas Unit comme void, le type de la fonction qui ne spécifie pas la valeur de retour sera Unit. Il a également été souligné qu'il est redondant dans l'IDE.

Référence: Connaître le type de Kotlin ~ Partie 1 ~

Product.java


abstract class Product {
	public abstract void use();
}

Product.kt


abstract class Product {
    abstract fun use()
}

Classe d'usine

Ici, nous allons implémenter le cadre d'instanciation. Le fait est que «créer un produit» et «s'enregistrer auprès d'un produit» sont laissés à l'implémentation de la sous-classe, mais la procédure de la méthode create peut lire l'intention que «la définition est décidée» comme finale dans la classe Factory. Je vais.

La différence entre Kotlin et java protected est que Java est accessible à partir d'une sous-classe ou d'une classe du même package, tandis que Kotlin n'est accessible qu'à partir d'une sous-classe. Ici, nous utilisons kotlin protected, qui n'est accessible qu'à partir des sous-classes.

Référence: Relation entre les modificateurs d'accès kotlin et java

De plus, en Java, il s'agit d'une méthode de création finale publique, mais kotlin est «default» et est une méthode finale publique, elle n'est donc pas spécifiée.

Factory.java


abstract class Factory {
	public final Product create(String owner) {
		Product p = createProduct(owner);
		registerProduct(p);
		return p;
	}
	protected abstract Product createProduct(String owner);
	protected abstract void registerProduct(Product product);
}

Factory.kt


abstract class Factory {
    fun create(owner: String): Product {
        val p = createProduct(owner)
        registerProduct(p)
        return  p
    }
    protected abstract fun createProduct(owner: String): Product
    protected abstract fun registerProduct(product: Product)
}

Classe IDCard

Nous définirons les sous-classes comme des produits réels qui héritent de la classe Product.

Définissez ʻinit` lors de l'initialisation du constructeur avec kotlin.

Référence: [Kotlin] Comment écrire un constructeur

IDCard.java


class IDCard extends Product {
	private String owner;
	public IDCard(String owner) {
		System.out.println(owner + "Faites une carte.");
		this.owner = owner;
	}
	public void use() {
		System.out.println(owner + "Utilisez la carte.");
	}
	public String getOwner() {
		return owner;
	}
}

IDCard.kt


class IDCard (private val owner: String): Product() {
    init { println(owner + "Faites une carte.") }
    override fun use() = println(owner + "Utilisez la carte.")
    fun getOwner() = owner
}

Classe IDCardFactory

Il hérite de la classe Factory, qui est le cadre de création d'une instance, et implémente un traitement spécifique. La méthode createProduct qui crée une instance et crée réellement le produit, et la méthode registerProduct qui réalise l'enregistrement dans le champ des propriétaires sont implémentées.

Dans Kotlin, List semble être en lecture seule et utilise mutableList qui peut être ajouté.

Référence: Kotlin and List

De plus, Kotlin n'utilise pas new lors de l'instanciation.

Référence: Kotlin Syntax-Classes, Inheritance, Properties

De plus, au lieu d'instanceof dans la distribution, nous avons implémenté une distribution intelligente que le compilateur gérera bien.

Référence: Là où les programmeurs Java ont tendance à trébucher sur Kotlin

IDCardFactory.java


class IDCardFactory extends Factory {
	private List<String> owners = new ArrayList<String>();

	@Override
	protected Product createProduct(String owner) {
		return new IDCard(owner);
	}

	@Override
	protected void registerProduct(Product product) {
		owners.add(((IDCard)product).getOwner());
	}
	
	public List<String> getOwners() {
		return owners;
	}
}

IDCardFactory.kt


class IDCardFactory: Factory() {
    private var owners: MutableList<String> = mutableListOf()
    override fun createProduct(owner: String) = IDCard(owner)
    override fun registerProduct(product: Product) {
        if(product is IDCard) owners.add(product.getOwner()) //smart cast
    }
    fun getOwners() = owners
}

Classe principale

Je vais créer une carte d'identité.

FactorySample.java


public class FactorySample {
	public static void main(String[] args) {
		Factory factory = new IDCardFactory();
		Product card1 = factory.create("Sato");
		Product card2 = factory.create("Suzuki");
		Product card3 = factory.create("Tanaka");
		card1.use();
		card2.use();
		card3.use();
		((IDCardFactory)factory).getOwners().stream().forEach(System.out::println);
	}
}

FactorySample.kt


fun main(args: Array<String>){
    val factory = IDCardFactory()
    val card1 = factory.create("Sato")
    val card2 = factory.create("Suzuki")
    val card3 = factory.create("Tanaka")
    card1.use()
    card2.use()
    card3.use()
    factory.getOwners().forEach(System.out::println)
}

Résultat d'exécution


Faites la carte de Sato.
Je vais faire une carte Suzuki.
Fabriquez la carte de Tanaka.
J'utiliserai la carte de Sato.
J'utiliserai la carte de Suzuki.
J'utiliserai la carte de Tanaka.
Sato
Suzuki
Tanaka

Diagramme de classe

image.png

Impressions

  1. Si aucune valeur de retour n'est spécifiée, void ʻUnit` est spécifié par défaut, il n'est donc pas nécessaire de le définir.
  2. La spécification de «protected» est différente de Java
  3. La définition de la méthode est «public final» par défaut
  4. Utilisez ʻinit` pour initialiser le constructeur
  5. List peut être en lecture seule, mutableList peut être ajouté
  6. Ne pas utiliser new lors de la création d'une instance
  7. «smart cast» est pratique pour le casting

référence

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

Connaître le type de Kotlin ~ Partie 1 ~ Relation entre les modificateurs d'accès kotlin et java [Kotlin] Comment écrire un constructeur Kotlin et List Classes de syntaxe Kotlin, héritage, propriétés Là où les programmeurs Java ont tendance à trébucher sur Kotlin

Recommended Posts

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
J'ai écrit un modèle de conception dans l'édition Kotlin Prototype
Un mémo que j'ai écrit un tri rapide en Python
Apprenez le modèle de conception "Abstract Factory" avec Python
J'ai écrit une classe en Python3 et Java
Apprenez le modèle de conception "Méthode d'usine" en Python
J'ai écrit un analyseur japonais en japonais en utilisant pyparsing.
Design Pattern #Factory, méthode
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 une fonction pour charger le script d'extension Git en Python
J'ai écrit Fizz Buzz en Python
J'ai écrit Gray Scale avec Pytorch
J'ai écrit un script pour extraire les liens de pages Web en Python
J'ai écrit la file d'attente en Python
J'ai participé à AtCoder (édition ABC169)
J'ai écrit la pile en Python
J'ai écrit un code pour convertir quaternion en angle de graissage de type z-y-x avec Python
[Python] J'ai écrit de force une courte fonction de génération de bruit parlin dans Numpy.
J'ai écrit FizzBuzz en python en utilisant la machine à vecteurs de support (bibliothèque LIVSVM).
Apprenez le modèle de conception "Builder" avec Python
Je veux imprimer dans la notation d'inclusion
Apprenez le modèle de conception "Flyweight" en Python
J'ai fait un programme de gestion de la paie en Python!
Apprenez le modèle de conception "Observer" 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 "Bridge" avec Python
Apprenez le modèle de conception "Mediator" avec Python
Apprenez le modèle de conception "Décorateur" avec Python
Tri sélect écrit en C
Apprenez le modèle de conception "Iterator" avec Python
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 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
[Gang of Four] Apprentissage des modèles de conception - Usine abstraite
Quand j'obtiens une erreur de pilote chrome dans Selenium
Supprimer des données dans un modèle avec Redis Cluster
Apprenez le modèle de conception "Méthode de modèle" en Python
Je veux créer une fenêtre avec Python
J'ai essayé de jouer à un jeu de frappe avec Python
[Gang of Four] Apprentissage des modèles de conception - Méthode d'usine
J'ai écrit "Introduction à la vérification des effets" en Python