Modèle de prototype en Java

introduction

Présentation des modèles de conception de [GoF](https://ja.wikipedia.org/wiki/Gang of for _ (Information Engineering)) ["Introduction aux modèles de conception appris dans le langage Java augmenté et révisé"]( https://www.amazon.co.jp/ Édition augmentée et révisée Introduction aux modèles de conception appris en langage Java-Yuki-Hiroshi / dp / 4797327030 / ref = pd_lpo_sbs_14_t_0? _ Encoding = UTF8 & psc = 1 & refRID = 2ZE4GPYNN55JGDR5QMHP) Je vais résumer sur.

Modèle de prototype

Qu'est-ce que le prototype

Traduit en japonais, cela signifie «prototype». Le modèle ** qui utilise cette ** instance de prototype pour copier (dupliquer) d'autres classes et créer une nouvelle instance est appelé le ** modèle de prototype **. Normalement, new est utilisé lors de la création d'une instance, mais dans le modèle Prototype, au lieu de new, la méthode clone définie dans la classe java.lang.Object, qui est une superclasse de toutes les classes, est utilisée. Créez une instance.

Personnage

Le modèle Prototype est utilisé par les classes qui apparaissent dans le diagramme de classes ci-dessous. image.png

Classe abstraite

Classe d'implémentation

Exemple concret

A titre d'exemple concret, nous expliquerons en nous basant sur la classe suivante. image.png

interface

Product.java


package framework;

import java.lang.Cloneable;

// 1. java.lang.Hériter clonable
public interface Product extends Cloneable {
	public abstract void display(String s);

//2.Déclarer la méthode createClone
	public abstract Product createClone();
}

Les points sont les deux points suivants. ** 1. ** Hérite de l'interface java.lang.Cloneable afin qu'elle puisse être copiée avec la méthode clone. ** 2. ** Déclarer la méthode createClone.

Je vais donner une explication supplémentaire. La méthode clone est définie dans la classe java.lang.Object, qui est une superclasse de toutes les classes. Pour exécuter cette méthode clone, la classe source doit implémenter l'interface java.lang.Cloneable. Si vous n'implémentez pas l'interface java.lang.Cloneable, vous obtiendrez une exception de CloneNotSupportedException. De plus, en ce qui concerne la méthode createClone, c'est une méthode pour utiliser la méthode clone, mais l'implémentation est effectuée par les sous-classes Surround class et ʻUnderLine`.

Classe d'implémentation

Client.java


package framework;

import java.util.*;

public class Client {
	private HashMap<String, Product> stringName = new HashMap<>();

	// 1.Inscrivez-vous avec HashMap
	public void register(String name, Product pro) {
		stringName.put(name, pro);
	}

	// 2.Utilisez la méthode createClone
	public Product create(String proname) {
		Product p = (Product) stringName.get(proname);
		return p.createClone();
	}
}

La classe Client est une classe permettant d'utiliser la méthode de copie. Les points sont les deux points suivants. ** 1. ** La méthode register est utilisée pour enregistrer une instance qui implémente l'interface Product dans HashMap. ** 2. ** Vous utilisez la méthode createClone () dans la méthode create.

Surround.java


import framework.*;

public class Surround implements Product {
	private char srchar;

	public Surround(char srchar) {
		this.srchar = srchar;
	}

	// 1.Implémentation de la méthode d'affichage
	@Override
	public void display(String s) {
		int length = s.getBytes().length;
		for (int i = 0; i < length + 4; i++) {
			System.out.print(srchar);
		}
		System.out.println("");
		System.out.println(srchar + " " + s + " " + srchar);
		for (int i = 0; i < length + 4; i++) {
			System.out.print(srchar);
		}
		System.out.println("\n");
	}

	// 2.Implémentation de la méthode createClone
	@Override
	public Product createClone() {
		Product p = null;
		try {
			p = (Product) clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return p;
	}
}

La classe Surround est une classe pour implémenter des méthodes de copie. Les points sont les deux points suivants. ** 1. ** Le caractère reçu par le constructeur est utilisé pour encadrer et afficher la chaîne de caractères reçue lorsque la méthode display est appelée. La méthode display est implémentée. ** 2. ** Implémentation de la méthode createClone.

Je vais donner une explication supplémentaire sur 2. Les points sont ** 2 **. Le premier est le ** point inclus dans l'instruction ** try-catch. La méthode clone doit implémenter l'interface java.lang.Cloneable comme décrit dans l'interface du produit. S'il n'est pas implémenté, une exception de CloneNotSupportedException se produira, elle est donc incluse dans une instruction try-catch en tenant compte du cas où une exception se produit. La seconde est que la méthode clone est appelée dans la méthode ** createClone **. Vous ne pouvez appeler la méthode clone qu'à partir de votre propre classe (ou sous-classe). Par conséquent, pour appeler la méthode clone à partir de la classe Client, il est nécessaire de faire l'appel via une autre méthode telle que la méthode createClone.

Underline.java


import framework.*;

public class Underline implements Product {
	private char ulchar;

	public Underline(char ulchar) {
		this.ulchar = ulchar;
	}

	// 1.Implémentation de la méthode d'affichage
	@Override
	public void display(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("\n");
	}

	// 2.Implémentation de la méthode createClone
	@Override
	public Product createClone() {
		Product p = null;
		try {
			p = (Product) clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return p;
	}
}

La classe ʻUnderlineest une classe pour implémenter des méthodes de copie comme la classeSurround. Les points sont les deux points suivants. ** 1. ** Le caractère reçu par le constructeur implémente la méthode display qui s'affiche sous forme de soulignement sous la chaîne de caractères reçue lorsque la méthode displayest appelée. ** 2. ** Implémentation de la méthodecreateClone`.

L'explication supplémentaire est la même que pour la classe Surround, elle est donc omise.

Classe d'exécution

Main.java


import framework.*;

public class Main {
	public static void main(String[] args) {
		//Préparation
		Client manager = new Client();
		Underline ul1 = new Underline('-');
		Underline ul2 = new Underline('~');
		Surround sr1 = new Surround('#');
		Surround sr2 = new Surround('@');
		manager.register("underLine text1", ul1);
		manager.register("underLine text2", ul2);
		manager.register("surround text1", sr1);
		manager.register("surround text2", sr2);

		//produire
		Product p1 = manager.create("underLine text1");
		p1.display("Hello, world.");
		Product p2 = manager.create("underLine text2");
		p2.display("Hello, world.");
		Product p3 = manager.create("surround text1");
		p3.display("Hello, world.");
		Product p4 = manager.create("surround text2");
		p4.display("Hello, world.");
	}
}

En préparation, la méthode register est utilisée pour enregistrer les instances Underline et Surround. Lors de la création, nous appelons la méthode create pour faire une copie de l'instance et appelons la méthode display.

Résultat d'exécution

Le résultat de l'exécution de Main.java est le suivant. Vous pouvez confirmer que les caractères donnés sont soulignés ou inclus.

Résultat d'exécution


"Hello, world."
 -------------

"Hello, world."
 ~~~~~~~~~~~~~ 

#################
# Hello, world. #
#################

@@@@@@@@@@@@@@@@@
@ Hello, world. @
@@@@@@@@@@@@@@@@@

** * Ajout: 2018/11/8 ** J'ai demandé à links_2_3_4 comment ajouter un espace pleine largeur à la fin. Merci beaucoup.

mérite

Il y a les trois points suivants. ** 1. ** Lorsqu'il y a plusieurs instances de classes similaires, il n'est pas nécessaire de séparer les classes et c'est facile à gérer. ** 2. ** S'il est difficile de créer une instance à partir d'une classe, vous pouvez facilement créer une instance. ** 3. ** Vous pouvez séparer le framework de l'instance à créer.

Résumé

Vous avez découvert le modèle Prototype consistant à copier d'autres classes et à créer de nouvelles instances à l'aide de l'instance prototype. L'exemple de code est téléchargé ci-dessous, veuillez donc vous y référer si vous le souhaitez.

En outre, d'autres modèles de conception sont résumés ci-dessous, veuillez donc vous y référer également.

Les références

Recommended Posts

Modèle de prototype en Java
Modèle de façade en Java
Motif singleton en Java
Modèle de poids mouche en Java
Modèle d'observateur en Java
Modèle d'itérateur en Java
Modèle de décorateur en Java
Modèle de proxy en Java
Modèle de méthode de modèle en Java
Modèle de chaîne de responsabilité en Java
Motif singleton en Python
Modèle de visiteur en Python
J'ai écrit un modèle de conception dans l'édition Kotlin Prototype
Résumé des modèles de prototypes d'introduction aux modèles de conception appris en langage Java
Mettre en œuvre un test piloté par table en Java
Détectez et traitez les signaux en Java.
Implémenter le modèle Singleton en Python
Mise en œuvre du tri à bulles en Java (BubbleSort)
Résumé du modèle de conception Java GoF
Chevauchement d'expressions régulières en Python et Java
Apprenez le modèle de conception "Builder" avec Python
Apprenez le modèle de conception "Flyweight" 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
Rendement Python express en JavaScript ou Java
Appliquer le formateur Google Java Style avec IntelliJ
Différences entre la syntaxe Python et Java
Recevoir des e-mails à l'aide de l'API Gmail en Java
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
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
Lançons le script Bash en Java
Apprenez le modèle de conception "Adapter" avec Python