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.
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.
Le modèle Prototype est utilisé par les classes qui apparaissent dans le diagramme de classes ci-dessous.

createClone.
L'implémentation se fait dans la classe de sous-classe ConcreatePrototype.ConcreatePrototype
Implémente la méthode createClone définie dans la classe Superclass Prototype.
Client
Une classe qui utilise la méthode createClone.
A titre d'exemple concret, nous expliquerons en nous basant sur la classe suivante.

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`.
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.
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.
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.
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.
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.
Recommended Posts