"Un modèle de conception par jour" - Modèle d'usine simple (SimpleFactory)

1.Intention

N'exposez pas les détails internes aux clients lors de la création d'un objet et fournissez une interface générique pour la création d'objets.

2. Diagramme de classe

Barre de fabrique simple Les opérations d'instanciation sont placées dans une seule classe, et cette classe devient une classe de fabrique simple, permettant à la classe de fabrique simple de décider quelle sous-classe spécifique utiliser pour l'instanciation.
Cela dissocie l'implémentation de la classe client des sous-classes concrètes, et la classe client n'a plus besoin de savoir quelles sous-classes sont disponibles et quelles sous-classes doivent être instanciées. Il existe souvent plusieurs classes clientes. Si une usine simple n'est pas utilisée, toutes les classes clientes doivent connaître les détails de toutes les sous-classes. Et une fois que la sous-classe change, comme l'ajout de sous-classes, toutes les classes client doivent être modifiées.
insérez la description de l'image ici

3. Structure du motif

Le modèle Simple Factory comprend les rôles suivants :

  • Usine : le rôle d'usine est responsable de la mise en œuvre de la logique interne de création de toutes les instances (décidant quelle classe appeler pour créer l'instance)
  • AbstratProduct : le rôle de produit abstrait est la classe parente de tous les objets créés et est responsable de la description de l'interface commune à toutes les instances.
  • ConcreteProduct : le rôle de produit spécifique est la cible de création, et tous les objets créés agissent comme l'implémentation d'une classe spécifique de ce rôle.
  • insérez la description de l'image ici

4. Exemple d'application :

Question : Veuillez implémenter un programme de console d'ordinateur dans n'importe quel langage orienté objet de C++, Java, C# ou VB.NET, nécessitant la saisie de deux nombres et symboles d'opération, et obtenez le résultat/
Idée générale : Toutes les activités sont dans le programme principal Terminé , entrez deux nombres, jugez l'entrée de symbole à partir de la console, puis effectuez l'opération.

public class Program {
    
    
    public static void main(String[] args) {
    
    
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入数字A:");
        Double A=sc.nextDouble();
        System.out.println("请输入运算符号:");
        String B=sc.next();
        System.out.println("请输入数字C:");
        Double C=sc.nextDouble();
        if(B.equals("+")){
    
    
            System.out.println("结果是:"+(A+C));
        }else if(B.equals("-")){
    
    
            System.out.println("结果是:"+(A-C));

        }else if(B.equals("*")){
    
    
            System.out.println("结果是:"+(A*C));
        }else if(B.equals("/")){
    
    
            System.out.println("结果是:"+(A/C));
        }

    }
}

Un tel programme lui-même n'est pas faux et réalise la fonction de calcul. Mais ce genre de réflexion fait que notre programme ne répond qu'aux besoins actuels, le programme n'est pas facile à maintenir, pas facile à étendre et pas facile à réutiliser. Par conséquent, les exigences d'un code de haute qualité ne peuvent pas être satisfaites. Par exemple, ajoutez une autre fonction, recherchez le signe racine ou recherchez le reste. L'ajout d'une telle fonction nécessite de modifier le code d'origine et la réutilisation du code n'est pas élevée.
Modèle de fabrique simple :
implémentez une classe de base, puis encapsulez chaque opération dans une classe concrète et héritez de cette classe. De cette façon, chaque fois que vous ajouterez une méthode dans le futur, il vous suffira d'ajouter une nouvelle classe.

Classe d'opération :

public class Operation {
    
    
      private double numberA=0;
      private double numberB=0;

      public double getNumberA() {
    
    
            return numberA;
      }

      public void setNumberA(double numberA) {
    
    
            this.numberA = numberA;
      }

      public double getNumberB() {
    
    
            return numberB;
      }

      public void setNumberB(double numberB) {
    
    
            this.numberB = numberB;
      }
      public double getResult() throws Exception {
    
    
            double result=0;
            return result;
      }
}

Classe d'addition :

public class OperationAdd extends Operation{
    
    
    @Override
    public double getResult() {
    
    
        return this.getNumberA()+this.getNumberB();
    }
}

Classe de soustraction :

public class OperationSub extends Operation{
    
    
    @Override
    public double getResult() {
    
    
        return this.getNumberA()-this.getNumberB();
    }
}

Classe de multiplication :

public class OperationMul extends  Operation{
    
    
    @Override
    public double getResult() {
    
    
        return this.getNumberA()*this.getNumberB();
    }
}


Classe divisionnaire :

public class OperationDiv extends Operation {
    
    
    @Override
    public double getResult() throws Exception {
    
    
        if(this.getNumberB()==0){
    
    
            throw  new Exception("除数不能为0");
        }
        return this.getNumberA()/this.getNumberB();
    }
}

Programme principal :

public class Program {
    
    
    public static void main(String[] args) throws Exception {
    
    
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入数字A:");
        Double A=sc.nextDouble();
        System.out.println("请输入运算符号:");
        String B=sc.next();
        System.out.println("请输入数字C:");
        Double C=sc.nextDouble();
        if(B.equals("+")){
    
    
            Operation oper=createOperate.createOperate("+");
            oper.setNumberA(A);
            oper.setNumberB(C);
            System.out.println("结果是:"+oper.getResult());
        }else if(B.equals("-")){
    
    
            Operation oper=createOperate.createOperate("-");
            oper.setNumberA(A);
            oper.setNumberB(C);
            System.out.println("结果是:"+oper.getResult());

        }else if(B.equals("*")){
    
    
            Operation oper=createOperate.createOperate("*");
            oper.setNumberA(A);
            oper.setNumberB(C);
            System.out.println("结果是:"+oper.getResult());
        }else if(B.equals("/")){
    
    
            Operation oper=createOperate.createOperate("/");
            oper.setNumberA(A);
            oper.setNumberB(C);
            System.out.println("结果是:"+oper.getResult());
        }

    }
}

Je suppose que tu aimes

Origine blog.csdn.net/qq_44867340/article/details/117370029
conseillé
Classement