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 classe
Surround. 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éthode
createClone`.
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