diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/consumermodule/pom.xml b/core-java-modules/core-java-jpms/decoupling-pattern1/consumermodule/pom.xml
new file mode 100644
index 0000000000..4f1a4794c8
--- /dev/null
+++ b/core-java-modules/core-java-jpms/decoupling-pattern1/consumermodule/pom.xml
@@ -0,0 +1,30 @@
+
+
+ 4.0.0
+ mainappmodule
+ jar
+ 1.0
+
+
+ com.baeldung.decoupling-pattern1
+ com.baeldung.decoupling-pattern1
+ 1.0
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+
+
+
+
+ com.baeldung.servicemodule
+ servicemodule
+ 1.0
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/consumermodule/src/main/java/com/baeldung/consumermodule/Application.java b/core-java-modules/core-java-jpms/decoupling-pattern1/consumermodule/src/main/java/com/baeldung/consumermodule/Application.java
new file mode 100644
index 0000000000..c4b5eed011
--- /dev/null
+++ b/core-java-modules/core-java-jpms/decoupling-pattern1/consumermodule/src/main/java/com/baeldung/consumermodule/Application.java
@@ -0,0 +1,13 @@
+package com.baeldung.consumermodule;
+
+import com.baeldung.servicemodule.external.TextService;
+import com.baeldung.servicemodule.external.TextServiceFactory;
+
+public class Application {
+
+ public static void main(String args[]) {
+ TextService textService = TextServiceFactory.getTextService("lowercase");
+ System.out.println(textService.processText("Hello from Baeldung!"));
+ }
+
+}
diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/consumermodule/src/main/java/module-info.java b/core-java-modules/core-java-jpms/decoupling-pattern1/consumermodule/src/main/java/module-info.java
new file mode 100644
index 0000000000..c02e6e6522
--- /dev/null
+++ b/core-java-modules/core-java-jpms/decoupling-pattern1/consumermodule/src/main/java/module-info.java
@@ -0,0 +1,3 @@
+module com.baeldung.consumermodule {
+ requires com.baeldung.servicemodule;
+}
diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/pom.xml b/core-java-modules/core-java-jpms/decoupling-pattern1/pom.xml
new file mode 100644
index 0000000000..282723e0a0
--- /dev/null
+++ b/core-java-modules/core-java-jpms/decoupling-pattern1/pom.xml
@@ -0,0 +1,35 @@
+
+
+ 4.0.0
+ com.baeldung.decoupling-pattern1
+ decoupling-pattern1
+ 1.0
+ pom
+
+
+ servicemodule
+ consumermodule
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.0
+
+
+ 11
+
+
+
+
+
+
+
+ UTF-8
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule/pom.xml b/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule/pom.xml
new file mode 100644
index 0000000000..1bda70f867
--- /dev/null
+++ b/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule/pom.xml
@@ -0,0 +1,24 @@
+
+
+ 4.0.0
+
+ com.baeldung.servicemodule
+ servicemodule
+ jar
+
+
+ com.baeldung.decoupling-pattern1
+ decoupling-pattern1
+ 1.0
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule/src/main/java/com/baeldung/servicemodule/external/TextService.java b/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule/src/main/java/com/baeldung/servicemodule/external/TextService.java
new file mode 100644
index 0000000000..2b9f0dce50
--- /dev/null
+++ b/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule/src/main/java/com/baeldung/servicemodule/external/TextService.java
@@ -0,0 +1,7 @@
+package com.baeldung.servicemodule.external;
+
+public interface TextService {
+
+ String processText(String text);
+
+}
diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule/src/main/java/com/baeldung/servicemodule/external/TextServiceFactory.java b/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule/src/main/java/com/baeldung/servicemodule/external/TextServiceFactory.java
new file mode 100644
index 0000000000..4611bc1c8c
--- /dev/null
+++ b/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule/src/main/java/com/baeldung/servicemodule/external/TextServiceFactory.java
@@ -0,0 +1,14 @@
+package com.baeldung.servicemodule.external;
+
+import com.baeldung.servicemodule.internal.LowercaseTextService;
+import com.baeldung.servicemodule.internal.UppercaseTextService;
+
+public class TextServiceFactory {
+
+ private TextServiceFactory() {}
+
+ public static TextService getTextService(String name) {
+ return name.equalsIgnoreCase("lowercase") ? new LowercaseTextService(): new UppercaseTextService();
+ }
+
+}
diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule/src/main/java/com/baeldung/servicemodule/internal/LowercaseTextService.java b/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule/src/main/java/com/baeldung/servicemodule/internal/LowercaseTextService.java
new file mode 100644
index 0000000000..e2d98f609e
--- /dev/null
+++ b/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule/src/main/java/com/baeldung/servicemodule/internal/LowercaseTextService.java
@@ -0,0 +1,12 @@
+package com.baeldung.servicemodule.internal;
+
+import com.baeldung.servicemodule.external.TextService;
+
+public class LowercaseTextService implements TextService {
+
+ @Override
+ public String processText(String text) {
+ return text.toLowerCase();
+ }
+
+}
diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule/src/main/java/com/baeldung/servicemodule/internal/UppercaseTextService.java b/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule/src/main/java/com/baeldung/servicemodule/internal/UppercaseTextService.java
new file mode 100644
index 0000000000..c94da2a8a5
--- /dev/null
+++ b/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule/src/main/java/com/baeldung/servicemodule/internal/UppercaseTextService.java
@@ -0,0 +1,12 @@
+package com.baeldung.servicemodule.internal;
+
+import com.baeldung.servicemodule.external.TextService;
+
+public class UppercaseTextService implements TextService {
+
+ @Override
+ public String processText(String text) {
+ return text.toUpperCase();
+ }
+
+}
diff --git a/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule/src/main/java/module-info.java b/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule/src/main/java/module-info.java
new file mode 100644
index 0000000000..230b659aa9
--- /dev/null
+++ b/core-java-modules/core-java-jpms/decoupling-pattern1/servicemodule/src/main/java/module-info.java
@@ -0,0 +1,3 @@
+module com.baeldung.servicemodule {
+ exports com.baeldung.servicemodule.external;
+}