Définition: Définissez une interface pour créer un objet, laissez la sous-classe décider quelle classe instancier, et la méthode d'usine retarde l'instanciation d'une classe à sa sous-classe.
Type: Créer un schéma de classe de modèle de classe:
Code de modèle de méthode d'usine
interface iProduct {public void productMethod (); } Class Product implémente iProduct {public void productMethod () {System.out.println ("Product"); }} interface ifactory {public iproduct createProduct (); } Class Factory implémente ifactory {public iProduct CreateProduct () {return new Product (); }} public class Client {public static void main (String [] args) {ifactory factory = new Factory (); IProduct product = factory.CreateProduct (); produce.productMethod (); }} Mode d'usine:
Tout d'abord, nous devons parler du modèle d'usine. Les modes d'usine sont divisés en trois types en fonction du degré d'abstraction: mode d'usine simple (également connu sous le nom de mode d'usine statique), mode de méthode d'usine décrit dans cet article et mode d'usine abstrait. Le mode d'usine est un modèle souvent utilisé dans la programmation. Ses principaux avantages sont:
Il peut rendre la structure du code claire et encapsuler efficacement les changements. En programmation, l'instanciation des classes de produits est parfois complexe et modifiable. Grâce au modèle d'usine, l'instanciation des produits est encapsulée, de sorte que l'appelant n'a pas besoin de se soucier du processus d'instanciation du produit et de simplement compter sur l'usine pour obtenir le produit qu'il souhaite.
Bloquer les catégories de produits spécifiques de l'appelant. Si vous utilisez le mode d'usine, l'appelant ne se soucie que de l'interface du produit. Quant à l'implémentation spécifique, l'appelant n'a pas du tout besoin de s'en soucier. Même si l'implémentation spécifique est modifiée, cela n'aura aucun impact sur l'appelant.
Réduire le couplage. L'instanciation des classes de produits est généralement très compliquée. Il faut s'appuyer sur de nombreuses classes, et ces classes n'ont pas du tout besoin d'être connu de l'appelant. Si une méthode d'usine est utilisée, tout ce que nous devons faire est d'instancier la classe de produit, puis de le remettre à l'appelant pour une utilisation. Pour l'appelant, les classes dont dépend le produit sont transparentes.
Mode Méthode d'usine:
Grâce au diagramme de classe du modèle de méthode d'usine, nous pouvons voir que le modèle de méthode d'usine a quatre éléments:
Interface d'usine. L'interface d'usine est le cœur du modèle de méthode d'usine et est utilisée pour fournir des produits directement avec l'appelant. Dans la programmation réelle, une classe abstraite est parfois utilisée comme une interface pour interagir avec l'appelant, ce qui est essentiellement le même.
Implémentation d'usine. En programmation, l'implémentation d'usine détermine comment instancier des produits, ce qui est un moyen d'atteindre l'expansion. Le nombre de produits requis est autant d'implémentations d'usine spécifiques qu'il y en a.
Interface du produit. L'objectif principal d'une interface de produit est de définir les spécifications du produit, et toutes les implémentations de produits doivent être conformes aux spécifications définies par l'interface du produit. Les interfaces de produits sont ce dont les appelants se soucient le plus, et les avantages et les inconvénients des définitions d'interface de produit déterminent directement la stabilité du code de l'appelant. De même, les interfaces de produit peuvent également être remplacées par des classes abstraites, mais veillez à ne pas violer le principe de remplacement de Richter.
Implémentation du produit. Les catégories spécifiques d'interfaces de produit déterminent le comportement spécifique du produit dans le client.
Avantages du modèle de méthode d'usine:
1. Bon emballage et réduisez le couplage entre les modules;
2. Face aux interfaces de produit et bloquant les catégories de produits.
3. Cadre de découplage typique. Les modules de haut niveau n'ont besoin que de connaître la classe abstraite du produit.
4. Respectez la loi dimitaise, le principe de dépendance à l'inversion et le principe du remplacement de Richter.
Scénarios applicables:
Qu'il s'agisse du modèle d'usine simple, du modèle de méthode d'usine ou du modèle d'usine abstrait, ils ont des caractéristiques similaires, de sorte que leurs scénarios applicables sont également similaires.
Tout d'abord, en tant que modèle de classe de création, le modèle de méthode d'usine peut être utilisé n'importe où des objets complexes sont nécessaires. Une chose à noter est que les objets complexes conviennent à l'utilisation du mode d'usine, tandis que les objets simples, en particulier les objets qui peuvent être créés via de nouveaux, n'ont pas besoin d'utiliser le mode d'usine. Si vous utilisez le modèle d'usine, vous devez introduire une classe d'usine, ce qui augmentera la complexité du système.
Deuxièmement, le modèle d'usine est un mode de découplage typique, et la loi de dimingateur est particulièrement évidente dans le modèle d'usine. Si l'appelant doit ajouter des dépendances pour assembler le produit par lui-même, il peut envisager d'utiliser le modèle d'usine. Cela réduira considérablement le couplage entre les objets.
Encore une fois, comme le modèle d'usine s'appuie sur l'architecture abstraite, il remet la tâche d'instanier le produit à la classe d'implémentation à terminer, ce qui a une meilleure évolutivité. En d'autres termes, lorsque le système doit être plus évolutif, le modèle d'usine peut être pris en compte et différents produits peuvent être assemblés avec différentes usines de mise en œuvre.
Applications typiques
Pour illustrer les avantages du modèle d'usine, il peut y avoir un exemple plus approprié que d'assembler une voiture. Le scénario est comme ceci: la voiture se compose d'un moteur, de roues et d'un châssis, et maintenant il est nécessaire d'assembler une voiture et de la remettre à l'appelant. Si le mode d'usine n'est pas utilisé, le code est le suivant:
Class Engine {public void getStyle () {System.out.println ("Ceci est le moteur de la voiture"); }} classe sous-pan {public void getStyle () {System.out.println ("Ceci est le châssis de la voiture"); }} class Wheel {public void getStyle () {System.out.println ("Ceci est le pneu de la voiture"); }} public class Client {public static void main (String [] args) {moteur moteur = new moteur (); Antoure sous-étayant = nouveau sous-cible (); Roue de roue = nouvelle roue (); ICAR CAR = NOUVELLE CAR (ANNÉE, ROUE, MOTEUR); car.show (); }}On peut voir que pour assembler la voiture, l'appelant doit également instancier le moteur, le châssis et les pneus, et les composants de ces voitures sont indépendants de l'appelant, qui viole sérieusement la loi Dimitt et a un couplage trop élevé. Et c'est très défavorable à l'expansion. De plus, dans cet exemple, le moteur, le châssis et les pneus sont relativement spécifiques. Dans les applications réelles, les composants de ces produits peuvent être abstraits et l'appelant n'a aucune idée de comment assembler le produit. Si la méthode d'usine est utilisée, toute l'architecture semblera beaucoup plus claire.
interface ifactory {public icar createCar (); } Class Factory implémente ifactory {public icar createCar () {moteur moteur = new moteur (); Antoure sous-étayant = nouveau sous-cible (); Roue de roue = nouvelle roue (); ICAR CAR = NOUVELLE CAR (ANNÉE, ROUE, MOTEUR); voiture de retour; }} public class Client {public static void main (String [] args) {ifactory factory = new Factory (); Icar car = factory.createCar (); car.show (); }}Après avoir utilisé la méthode d'usine, le degré de couplage du côté de l'appel est considérablement réduit. Et pour les usines, il peut être élargi. Si vous souhaitez assembler d'autres voitures à l'avenir, il vous suffit d'ajouter une autre implémentation d'usine. La flexibilité et la stabilité ont été considérablement améliorées.
PS: mode méthode d'usine et mode d'usine simple
Le modèle d'usine simple mentionné ci-dessus est très similaire au modèle de méthode d'usine. Le noyau de la classe de méthode d'usine est une classe d'usine abstraite, tandis que le modèle d'usine simple place le noyau d'une classe concrète. La différence dans le modèle de méthode d'usine et le modèle d'usine simple n'est pas très évidente.