diff --git a/src/main/java/formula/Product.java b/src/main/java/formula/Product.java
index 65ddb825fce591c2e296507d52683aa4284c81f5..94ae51176d7e1a2a706787720c7d37d0e93f7aaf 100644
--- a/src/main/java/formula/Product.java
+++ b/src/main/java/formula/Product.java
@@ -1,45 +1,24 @@
 package formula;
 
-public class Product implements Formula {
-    private Formula[] formulas;
+public class Product extends VariadicOperator {
 
     public Product(Formula... formulas) {
-        this.formulas = formulas;
-    }
-
-    // Retourne la valeur initiale pour le produit (1)
-    public double initialValue() {
-        return 1;
-    }
-
-    // Cumul des valeurs pour le produit (multiplication)
-    public double cumulativeValue(double accumulator, double value) {
-        return accumulator * value;
+        super(formulas);
     }
 
     @Override
-    public String asString() {
-        StringBuilder sb = new StringBuilder("(");
-        for (int i = 0; i < formulas.length; i++) {
-            sb.append(formulas[i].asString());
-            if (i < formulas.length - 1) sb.append(symbol());
-        }
-        sb.append(")");
-        return sb.toString();
+    public String symbol() {
+        return "*";
     }
 
     @Override
-    public double asValue() {
-        double result = initialValue();  // Initialise avec la valeur de départ (1 pour Product)
-        for (Formula formula : formulas) {
-            result = cumulativeValue(result, formula.asValue());  // Multiplie chaque valeur
-        }
-        return result;
+    public double initialValue() {
+        return 1;
     }
 
-    // Méthode symbol() comme déjà définie
-    public String symbol() {
-        return "*";
+    @Override
+    public double cumulativeValue(double accumulator, double value) {
+        return accumulator * value;
     }
 }
 
diff --git a/src/main/java/formula/Sum.java b/src/main/java/formula/Sum.java
index 8e6b8ff4af77fbfaf0205a6e21e5c10676a66ffd..360174081c32d1bf3d72986d0e5d56de9e965321 100644
--- a/src/main/java/formula/Sum.java
+++ b/src/main/java/formula/Sum.java
@@ -1,44 +1,23 @@
 package formula;
 
-public class Sum implements Formula {
-    private Formula[] formulas;
+public class Sum extends VariadicOperator {
 
     public Sum(Formula... formulas) {
-        this.formulas = formulas;
-    }
-
-    // Retourne la valeur initiale pour la somme (0)
-    public double initialValue() {
-        return 0;
-    }
-
-    // Cumul des valeurs pour la somme (addition)
-    public double cumulativeValue(double accumulator, double value) {
-        return accumulator + value;
+        super(formulas);
     }
 
     @Override
-    public String asString() {
-        StringBuilder sb = new StringBuilder("(");
-        for (int i = 0; i < formulas.length; i++) {
-            sb.append(formulas[i].asString());
-            if (i < formulas.length - 1) sb.append(symbol());
-        }
-        sb.append(")");
-        return sb.toString();
+    public String symbol() {
+        return "+";
     }
 
     @Override
-    public double asValue() {
-        double result = initialValue();  // Initialise avec la valeur de départ (0 pour Sum)
-        for (Formula formula : formulas) {
-            result = cumulativeValue(result, formula.asValue());  // Ajoute chaque valeur
-        }
-        return result;
+    public double initialValue() {
+        return 0;
     }
 
-    // Méthode symbol() comme déjà définie
-    public String symbol() {
-        return "+";
+    @Override
+    public double cumulativeValue(double accumulator, double value) {
+        return accumulator + value;
     }
 }
diff --git a/src/main/java/formula/VariadicOperator.java b/src/main/java/formula/VariadicOperator.java
new file mode 100644
index 0000000000000000000000000000000000000000..640dea85a836482635ee507dfb54e9cdfae634aa
--- /dev/null
+++ b/src/main/java/formula/VariadicOperator.java
@@ -0,0 +1,39 @@
+package formula;
+
+public abstract class VariadicOperator implements Formula {
+    protected Formula[] formulas;
+
+    public VariadicOperator(Formula... formulas) {
+        this.formulas = formulas;
+    }
+
+    // Méthode abstraite pour le symbole
+    public abstract String symbol();
+
+    // Méthode abstraite pour la valeur initiale de l'opération
+    public abstract double initialValue();
+
+    // Méthode abstraite pour le cumul des valeurs
+    public abstract double cumulativeValue(double accumulator, double value);
+
+    @Override
+    public String asString() {
+        StringBuilder sb = new StringBuilder("(");
+        for (int i = 0; i < formulas.length; i++) {
+            sb.append(formulas[i].asString());
+            if (i < formulas.length - 1) sb.append(symbol());
+        }
+        sb.append(")");
+        return sb.toString();
+    }
+
+    @Override
+    public double asValue() {
+        double result = initialValue();
+        for (Formula formula : formulas) {
+            result = cumulativeValue(result, formula.asValue());
+        }
+        return result;
+    }
+}
+