design patterns java
Dans ce didacticiel, nous aborderons les modèles de conception en Java. Nous étudierons les modèles Singleton, Factory et Builder avec des exemples et des avantages:
Lorsque nous résolvons un problème spécifique, nous pouvons le résoudre plus efficacement si nous avons déjà défini certaines bonnes pratiques. Cela nous aidera en effet à suivre ces bonnes pratiques et à développer des solutions plus fiables.
Ces les meilleures pratiques qui peut être utilisé pour développer des solutions éprouvées pour résoudre des problèmes sont appelés ' Modèles de conception ». Les développeurs de logiciels POO expérimentés utilisent des modèles de conception pour résoudre des tâches spécifiques.
=> Jetez un œil au guide du débutant Java ici
Ce que vous apprendrez:
- Modèles de conception en Java
- Motif Singleton en Java
- Modèle d'usine en Java
- Modèle de générateur en Java
- Conclusion
Modèles de conception en Java
Les modèles de conception ont été inventés pour la première fois par Christopher Alexander en 1977. Mais plus tard, quatre développeurs, à savoir Erich Gamma, Richard Helm, John Vlissides et Ralph Johnson, ont écrit un livre intitulé « Gang of Four-Design patterns, éléments de logiciels orientés objet réutilisables ”En 1995.
À partir de là, tous les modèles de conception sont devenus connus sous le nom de « Groupe de quatre modèles de conception ».
comment tester au stylet un site Web
Les modèles de conception sont indépendants de tout langage de programmation car ils sont utilisés pour résoudre des problèmes de conception orientés objet courants et ne sont pas simplement limités à un langage de programmation spécifique. C'est donc essentiellement une idée et non une mise en œuvre.
Ainsi, en utilisant des modèles de conception, nous pouvons développer des programmes plus efficaces, flexibles, maintenables et réutilisables.
Avantages des modèles de conception
Voici quelques-uns des avantages de l'utilisation de modèles de conception dans nos applications:
- Les modèles de conception sont réutilisables et peuvent être utilisés par plusieurs projets.
- Nous pouvons définir l'architecture du système à l'aide de modèles de conception.
- Les modèles de conception assurent la transparence de la conception de l'application.
- Les modèles de conception sont déjà bien testés et éprouvés afin que nous puissions les utiliser sans aucun souci.
- Les modèles de conception nous permettent de créer de meilleurs systèmes et de clarifier l'architecture du système.
Quand utiliser les modèles de conception
Alors, quand devrions-nous utiliser exactement les modèles de conception?
Nous utilisons généralement un modèle de conception lors de la phase initiale d'analyse et d'exigence du SDLC (cycle de vie du développement logiciel). Lorsqu'il est utilisé pendant la phase d'analyse et d'exigence de SDLC, il fournit plus d'informations à cette phase. Java prend en charge en interne les modèles de conception.
Les modèles de conception en Java sont classés comme suit:
En ce qui concerne ce tutoriel, nous nous intéressons uniquement aux modèles de conception créative.
Les modèles de conception créative sont en outre classés comme suit:
Dans ce didacticiel, nous aborderons les modèles de conception suivants:
- Modèle de conception Singleton
- Modèle de conception d'usine
- Modèle de conception de constructeur
Commençons par un modèle de conception singleton en Java.
Lecture recommandée = >> Modèles de conception pour les applications basées sur Flask
Motif Singleton en Java
Un motif singleton est un type de motif de création en Java. Le modèle Singleton est un modèle de conception dans lequel une seule instance d'une classe est présente dans la machine virtuelle Java. Une classe singleton (implémentant un modèle singleton) doit fournir un point d'accès global pour obtenir l'instance de la classe.
En d'autres termes, un modèle singleton limite l'instanciation d'une classe. Le modèle Singleton est utilisé dans l'implémentation de l'enregistreur pour les applications. Il est également utilisé dans l'implémentation ou le cache du pool de threads.
Les classes Java, java.awt.Desktop et java.lang.runtime utilisez également un motif singleton.
Avantages
- Comme une seule instance de la classe singleton est utilisée, nous économisons de la mémoire.
- En outre, garantit la réutilisation car le même objet singleton est utilisé encore et encore.
Passons maintenant à l'implémentation du modèle singleton.
Implémentation du modèle Singleton
Comme déjà mentionné, un modèle de conception singleton restreint la classe à une seule instance et cette instance se voit attribuer un point d'accès global. Ce sont toutes les classes qui font référence au même objet encore et encore.
Le diagramme UML suivant explique le modèle Singleton.
Comme le montre le diagramme UML ci-dessus, une classe singleton a une seule instance définie et nous y accédons par la méthode getInstance (). Ainsi, une fabrique de singleton chargée de créer des objets utilise la méthode getInstance pour renvoyer le même objet (qui est là dans la classe) encore et encore.
Alors, comment implémenter le modèle Singleton dans un programme?
Nous créons une classe singleton et avons son constructeur comme «privé» afin que la classe ne puisse pas être instanciée. Ensuite, nous créons une instance privée de cette classe singleton à l'intérieur de la classe elle-même. Ensuite, nous avons une méthode publique spéciale getInstance () qui renvoie un objet singleton au monde extérieur.
Cette implémentation de cette classe singleton comme expliqué ci-dessus est montrée dans le programme Java ci-dessous.
class SingletonObject { //create an object of SingletonObject private static SingletonObject instance = new SingletonObject(); //private constructor so that we cannot instantiate the class private SingletonObject(){} //returns the only available object public static SingletonObject getInstance(){ return instance; } public void printMessage(){ System.out.println('Hello from Singleton object!!!'); } } public class Main { public static void main(String() args) { //illegal statement because constructor is private //Compile Time Error: The constructor SingletonObject() is not visible //SingletonObject object = new SingletonObject(); //call getInstance to retrieve the object available from the class SingletonObject object = SingletonObject.getInstance(); //show the message object.printMessage(); } }
Production:
Maintenant, si nous vérifions la méthode main, notez que si nous essayons de créer un objet de la classe singleton en utilisant un nouvel opérateur, le compilateur donnera une erreur de compilation (voir le code commenté dans la méthode main). Nous obtenons l'objet de la classe singleton en utilisant la méthode getInstance () puis nous pouvons l'utiliser comme d'habitude pour accéder aux méthodes.
Modèle d'usine en Java
Le modèle d'usine est également appelé «modèle de méthode d'usine» ou «constructeur virtuel» en Java. Dans ce modèle, nous créons une interface ou une classe abstraite avec des déclarations de méthode, puis les classes ou sous-classes concrètes implémentant cette interface ou héritant de la classe sont responsables de la création des instances de la classe.
Avantages
- Le modèle d'usine est un type de modèle de création et est le modèle le plus couramment utilisé en Java.
- En utilisant un modèle d'usine, nous nous assurons que la logique de création réelle n'est pas exposée au monde extérieur.
Donc, si une classe implémentant un modèle d'usine a une méthode pour calculer le taux d'intérêt, alors les classes concrètes implémenteront cette classe et implémenteront également la méthode pour calculer le taux d'intérêt.
Ensuite, il y aura une autre classe qui est une classe d'usine qui accédera à ces instances de classe concrètes afin que nous ne sachions pas comment la logique de calcul du taux d'intérêt est implémentée. Nous appelons uniquement la méthode et obtenons la sortie.
Alors, quand exactement pouvons-nous utiliser le modèle de méthode d'usine?
Lorsque les classes parentes décident de déléguer la création d'instances à leurs sous-classes, alors nous pouvons opter pour un modèle d'usine (ceci est expliqué ci-dessus). Nous pouvons également utiliser la méthode de fabrique lorsque la classe ne sait pas quelles sous-classes doivent être créées.
Voyons maintenant l'implémentation du modèle de méthode d'usine.
Mise en œuvre du modèle d'usine
À titre d'exemple, implémentons une interface de forme générique. Nous pouvons dériver diverses classes concrètes de cette interface comme le cercle, le rectangle, etc. Ensuite, nous aurons une classe shapeFactory qui accèdera aux objets de classe concrets. L'UML de ce modèle est illustré ci-dessous.
Comme déjà expliqué, il s'agit du diagramme UML pour le modèle d'usine. Nous allons maintenant implémenter un programme Java démontrant le modèle d'usine.
//Geometric_shape interface interface Geometric_shape { void draw_shape(); } //Geometric shape classes implementing Geometric_shape interface class Rectangle implements Geometric_shape { @Override public void draw_shape() { System.out.println('Rectangle class::draw_shape() method.'); } } class Square implements Geometric_shape { @Override public void draw_shape() { System.out.println('Square class::draw_shape() method.'); } } class Circle implements Geometric_shape { @Override public void draw_shape() { System.out.println('Circle class::draw_shape() method.'); } } //Factory class for Geometric_shape class ShapeFactory { //shapeObject method gets particular shapeType (circle, Square or Rectangle) public Geometric_shape shapeObject(String shapeType){ if(shapeType == null){ return null; } //retrieve Circle object if(shapeType.equalsIgnoreCase('Circle')){ return new Circle(); //retrieve Rectangle object } else if(shapeType.equalsIgnoreCase('Rectangle')){ return new Rectangle(); ////retrieve Square object } else if(shapeType.equalsIgnoreCase('Square')){ return new Square(); } return null; } } public class Main { public static void main(String() args) { //Create a ShapeFactory object to get different geometric shapes ShapeFactory shapeFactory = new ShapeFactory(); //circle Geometric_shape shape_Circle = shapeFactory.shapeObject('CIRCLE'); //draw method of Circle shape_Circle.draw_shape(); //Rectangle Geometric_shape shape_Rectangle = shapeFactory.shapeObject('RECTANGLE'); //draw method of Rectangle shape_Rectangle.draw_shape(); //Square Geometric_shape shape_Square = shapeFactory.shapeObject('SQUARE'); //draw method of square shape_Square.draw_shape(); } }
Production:
Modèle de générateur en Java
Dans le modèle Builder, nous utilisons une approche étape par étape pour créer un objet complexe à l'aide d'objets petits et simples.
Ainsi, chaque fois que nous rencontrons un objet qui ne peut pas être créé en une seule étape, nous optons pour un modèle de constructeur.
Avantages
- En utilisant le modèle Builder, nous pouvons séparer la construction et la représentation d'un objet.
- Nous pouvons également modifier la représentation interne de l'objet.
- Nous pouvons créer des conceptions complexes comme un système de livraison complet en utilisant le modèle de constructeur.
Un exemple pratique de modèle Builder est le système de commande de produits alimentaires qui impliquait des étapes complexes de collecte des produits alimentaires commandés, puis de conditionnement, de facturation, de commande de fabrication, puis d'expédition.
Dans ce didacticiel, nous allons implémenter un exemple de système de commande de tablettes utilisant le modèle Builder.
Implémentation du modèle de constructeur
Le diagramme UML général du modèle Builder est donné ci-dessous.
Le diagramme ci-dessus montre le diagramme UML du modèle Builder. Comme le montre le diagramme ci-dessus, nous avons quatre composants dans le modèle Builder.
- Produit: Cela représente l'objet complexe à construire.
- Classe abstraite du constructeur: Une classe abstraite contenant des prototypes de toutes les fonctionnalités requises pour créer un objet complexe.
- Classe ConcreteBuilder: Il s'agit d'une classe concrète qui hérite de la classe Builder et crée un objet complexe particulier. Nous pouvons avoir autant de classes ConcreteBuilder que nécessaire.
- Classe de réalisateur: Cette classe contrôle les algorithmes qui génèrent le produit final.
L'exemple de programmation suivant montre la démonstration d'un modèle Builder à l'aide d'un système de construction de commande de tablette.
import java.util.ArrayList; import java.util.List; //Packing interface for tablets interface Packing { public String pack(); public int price(); } //Tablet class - abstract abstract class Tablet implements Packing{ public abstract String pack(); } //company - extends Tablet abstract class Company extends Tablet{ public abstract int price(); } //Lenovo tablet class Lenovo extends Company{ @Override public int price(){ return 541; } @Override public String pack(){ return 'Lenovo Yoga'; } } //Micromax tablet class MicroMax extends Company { @Override public int price(){ return 338; } @Override public String pack(){ return 'MicroMax'; } } //Tablet type class TabType { private List items=new ArrayList(); //add items public void addItem(Packing packs) { items.add(packs); } //retrieve cost public void getCost(){ for (Packing packs : items) { packs.price(); } } //show all items public void showItems(){ for (Packing packing : items){ System.out.print('Tablet name : '+packing.pack()); System.out.println(', Price(in U.S.Dollars) : '+packing.price()); } } } //builder class for tablets order class TabBuilder { public TabType buildLenovoTab(){ TabType lenovo =new TabType(); lenovo.addItem(new Lenovo()); return lenovo; } public TabType buildMicroMaxTab(){ TabType mmx=new TabType(); mmx.addItem(new MicroMax()); return mmx; } } public class Main{ public static void main(String args()){ //build the tablets order and display the order TabBuilder tabBuilder=new TabBuilder(); TabType tabtype1=tabBuilder.buildLenovoTab(); tabtype1.showItems(); TabType tabtype2=tabBuilder.buildMicroMaxTab(); tabtype2.showItems(); } }
Production:
Dans l'exemple ci-dessus, nous avons construit le système complet de commande de tablettes pour deux marques de tablettes, à savoir Lenovo et Micromax. Ce sont les classes concrètes qui héritent de la société de classe abstraite. Ensuite, nous avons une classe TabBuilder qui construit les commandes pour les deux classes de tablette.
Questions fréquemment posées
Q # 1) Que sont les modèles de conception en Java? Quels sont les types de modèles de conception en Java?
j'ai besoin d'un nouveau fournisseur de messagerie
Répondre: Les modèles de conception sont les meilleures pratiques qui peuvent être utilisées pour développer des solutions bien testées.
Java a trois types de modèles de conception:
- Modèle de conception créative: Le motif Factory, le motif Abstract Factory, le motif Singleton, le motif Builder et le motif prototype sont des exemples de modèles de conception créative. Ceux-ci sont principalement impliqués dans la création d'objets.
- Modèle de conception structurelle: Ils sont principalement utilisés pour créer une structure de classe. L'adaptateur, le pont et le modèle composite sont des modèles de conception structurelle populaires.
- Modèle de conception comportementale: Ceux-ci fournissent une meilleure interaction entre les objets ainsi que la flexibilité d'étendre facilement la mise en œuvre. Les modèles d'observateur, le modèle de stratégie, etc. sont quelques exemples des modèles de comportement.
Q # 2) Pourquoi les modèles de conception sont-ils utilisés?
Répondre: Les modèles de conception nous fournissent un modèle de solution éprouvé et testé que nous pouvons utiliser pour résoudre des problèmes complexes. Les modèles de conception nous permettent de construire des modules cohésifs avec un couplage lâche. Les modèles de conception rendent également l'interaction entre les concepteurs plus efficace et efficiente.
Q # 3) Quels sont les exemples de modèles?
Répondre: Des exemples de modèles naturels sont les régularités visibles trouvées dans la nature. Les motifs naturels comme les symétries, les arbres, les vagues, les mousses, les rayures, les fissures, etc. sont quelques exemples de motifs naturels.
Q # 4) MVC est-il un modèle de conception?
Répondre: Oui, c'est une sorte de modèle de conception à l'aide duquel nous pouvons créer une application composée du modèle de données, de la présentation ou de la couche de vue et du contrôleur. Nous pouvons le classer davantage comme un modèle architectural.
Conclusion
Ceci termine notre discussion sur les modèles de conception en Java. Bien que Java prenne en charge trois types de modèles de conception, à savoir. Modèles créatifs, structurels et comportementaux, nous nous intéressons davantage au modèle de conception créative.
Conformément à la portée de ce didacticiel, nous avons discuté de trois exemples de modèles de conception créative, à savoir le modèle singleton, le modèle d'usine et le modèle de générateur.
Le modèle Singleton est le modèle de conception le plus simple et la méthode de fabrique est censée être un modèle de conception courant largement utilisé. Le modèle de générateur est utilisé pour construire des objets complexes et est principalement utilisé dans le développement d'applications complexes.
=> Consultez le guide de formation Perfect Java ici.
lecture recommandée
- Tutoriel Java String avec String Buffer et String Builder
- Déploiement Java: création et exécution d'un fichier JAR Java
- Principes de base de Java: syntaxe Java, classe Java et principaux concepts Java
- Machine virtuelle Java: comment JVM aide à exécuter une application Java
- Tutoriel JAVA pour les débutants: plus de 100 tutoriels vidéo Java pratiques
- Classe Java Integer et Java BigInteger avec exemples
- Composants Java: plateforme Java, JDK, JRE et machine virtuelle Java
- Liste des mots clés Java importants - Mots réservés en Java