Modèle d'usine


Factory Pattern est l’un des modèles de conception les plus couramment utilisés en Java. Ce type de modèle de conception est un modèle de création qui offre une manière optimale de créer des objets.

Dans le modèle d'usine, nous n'exposons pas la logique de création au client lors de la création d'objets et pointons vers les objets nouvellement créés en utilisant une interface commune.

Introduction

Intention : Définir une interface pour créer des objets et laisser ses sous-classes décider quelle classe d'usine instancier. Le modèle d'usine retarde le processus de création vers les sous-classes. procède.

Résout principalement : Résout principalement le problème de la sélection de l'interface.

Quand utiliser : Lorsque nous prévoyons explicitement de créer différentes instances dans différentes conditions.

Comment résoudre : Laissez sa sous-classe implémenter l'interface d'usine et renvoyer un produit abstrait.

Code clé : Le processus de création est exécuté dans sa sous-classe.

Exemples d'application : 1. Si vous avez besoin d'une voiture, vous pouvez la récupérer directement à l'usine sans vous soucier de la façon dont la voiture est fabriquée et de la mise en œuvre spécifique à l'intérieur. 2. Pour modifier la base de données Hibernate, il vous suffit de modifier le dialecte et le pilote.

Avantages : 1. Si un appelant souhaite créer un objet, il lui suffit de connaître son nom. 2. Haute évolutivité Si vous souhaitez ajouter un produit, il vous suffit d'étendre une classe d'usine. 3. Protégez l'implémentation spécifique du produit et l'appelant ne se soucie que de l'interface du produit.

Inconvénients : Chaque fois que vous ajoutez un produit, vous devez ajouter une classe spécifique et une usine d'implémentation d'objets, ce qui double le nombre de classes dans le système et augmente la complexité du système à un certain niveau. La complexité augmente également la dépendance à l’égard de classes spécifiques du système. Ce n'est pas une bonne chose.

Scénarios d'utilisation : 1. Enregistreur de journaux : les enregistrements peuvent être enregistrés sur le disque dur local, les événements système, les serveurs distants, etc. Les utilisateurs peuvent choisir où enregistrer les journaux. 2. Accès à la base de données, lorsque l'utilisateur ne sait pas quel type de base de données sera utilisé par le système final et quand la base de données peut changer. 3. La conception d'un cadre de connexion au serveur nécessite trois protocoles, "POP3", "IMAP" et "HTTP". Ces trois protocoles peuvent être utilisés comme catégories de produits pour implémenter conjointement une interface.

Remarque : En tant que modèle de création de classe, le modèle de méthode d'usine peut être utilisé partout où des objets complexes doivent être générés. Une chose à noter est que les objets complexes conviennent à l'utilisation du modèle d'usine, tandis que les objets simples, en particulier ceux qui ne peuvent être créés que via new, n'ont pas besoin d'utiliser le modèle 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.

Implémentation

Nous allons créer une interface Shape et une classe d'entité qui implémente l'interface Shape. L'étape suivante consiste à définir la classe d'usine ShapeFactory.

FactoryPatternDemo, notre classe de démonstration utilise ShapeFactory pour obtenir l'objet Shape. Il transmettra des informations (CERCLE / RECTANGLE / SQUARE) à la ShapeFactory afin d'obtenir le type d'objet dont il a besoin.

工厂模式的 UML 图

Étape 1

Créer une interface.

Shape.java

public interface Shape {
   void draw();
}

Étape 2

Créez une classe d'entité qui implémente l'interface.

Rectangle.java

public class Rectangle implements Shape {

   @Override
   public void draw() {
      System.out.println("Inside Rectangle::draw() method.");
   }
}

Carré.java

public class Square implements Shape {

   @Override
   public void draw() {
      System.out.println("Inside Square::draw() method.");
   }
}

Circle.java

public class Circle implements Shape {

   @Override
   public void draw() {
      System.out.println("Inside Circle::draw() method.");
   }
}

Étape 3

Créez une usine pour générer des objets de classes d'entités en fonction des informations fournies.

ShapeFactory.java

public class ShapeFactory {
	
   //使用 getShape 方法获取形状类型的对象
   public Shape getShape(String shapeType){
      if(shapeType == null){
         return null;
      }		
      if(shapeType.equalsIgnoreCase("CIRCLE")){
         return new Circle();
      } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
         return new Rectangle();
      } else if(shapeType.equalsIgnoreCase("SQUARE")){
         return new Square();
      }
      return null;
   }
}

Étape 4

Utilisez cette usine pour obtenir l'objet de la classe d'entité en transmettant les informations de type.

FactoryPatternDemo.java

public class FactoryPatternDemo {

   public static void main(String[] args) {
      ShapeFactory shapeFactory = new ShapeFactory();

      //获取 Circle 的对象,并调用它的 draw 方法
      Shape shape1 = shapeFactory.getShape("CIRCLE");

      //调用 Circle 的 draw 方法
      shape1.draw();

      //获取 Rectangle 的对象,并调用它的 draw 方法
      Shape shape2 = shapeFactory.getShape("RECTANGLE");

      //调用 Rectangle 的 draw 方法
      shape2.draw();

      //获取 Square 的对象,并调用它的 draw 方法
      Shape shape3 = shapeFactory.getShape("SQUARE");

      //调用 Square 的 draw 方法
      shape3.draw();
   }
}

Étape 5

Vérifiez la sortie.

Inside Circle::draw() method.
Inside Rectangle::draw() method.
Inside Square::draw() method.