diff --git a/design-pattern/README.md b/design-pattern/README.md
new file mode 100644
index 0000000..96e60d2
--- /dev/null
+++ b/design-pattern/README.md
@@ -0,0 +1 @@
+# Related articles
diff --git a/design-pattern/pom.xml b/design-pattern/pom.xml
new file mode 100644
index 0000000..e70d701
--- /dev/null
+++ b/design-pattern/pom.xml
@@ -0,0 +1,66 @@
+
+ 4.0.0
+ com.geekyhacker.design-pattern
+ geeky-hacker-design-pattern
+ jar
+ 1.0-SNAPSHOT
+ geeky-hacker-design-pattern
+ https://geekyhacker.com
+
+
+ UTF-8
+ 21
+
+
+
+
+ org.apache.commons
+ commons-lang3
+ 3.14.0
+
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ 5.10.2
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter-params
+ 5.10.2
+ test
+
+
+ org.mockito
+ mockito-core
+ 5.11.0
+ test
+
+
+ org.mockito
+ mockito-junit-jupiter
+ 5.11.0
+ test
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.13.0
+
+ 21
+ 21
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ 3.2.5
+
+
+
+
diff --git a/design-pattern/src/main/java/com/geekyhacker/design/pattern/creational/DatabaseConnector.java b/design-pattern/src/main/java/com/geekyhacker/design/pattern/creational/DatabaseConnector.java
new file mode 100644
index 0000000..1e586a4
--- /dev/null
+++ b/design-pattern/src/main/java/com/geekyhacker/design/pattern/creational/DatabaseConnector.java
@@ -0,0 +1,36 @@
+package com.geekyhacker.design.pattern.creational;
+
+public class DatabaseConnector {
+ private final String username;
+ private final String password;
+ private final String url;
+ private final int port;
+
+ DatabaseConnector(String username, String password, String url, int port) {
+ this.username = username;
+ this.password = password;
+ this.url = url;
+ this.port = port;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public int getPort() {
+ return port;
+ }
+
+ public boolean connect() {
+ System.out.println("Connecting to the database");
+ return true;
+ }
+}
diff --git a/design-pattern/src/main/java/com/geekyhacker/design/pattern/creational/DatabaseConnectorBuilder.java b/design-pattern/src/main/java/com/geekyhacker/design/pattern/creational/DatabaseConnectorBuilder.java
new file mode 100644
index 0000000..5713bf6
--- /dev/null
+++ b/design-pattern/src/main/java/com/geekyhacker/design/pattern/creational/DatabaseConnectorBuilder.java
@@ -0,0 +1,36 @@
+package com.geekyhacker.design.pattern.creational;
+
+public class DatabaseConnectorBuilder {
+ private String username;
+ private String password;
+ private String url;
+ private int port;
+
+ public static DatabaseConnectorBuilder newBuilder() {
+ return new DatabaseConnectorBuilder();
+ }
+
+ public DatabaseConnectorBuilder withUsername(String username) {
+ this.username = username;
+ return this;
+ }
+
+ public DatabaseConnectorBuilder withPassword(String password) {
+ this.password = password;
+ return this;
+ }
+
+ public DatabaseConnectorBuilder withUrl(String url) {
+ this.url = url;
+ return this;
+ }
+
+ public DatabaseConnectorBuilder withPort(int port) {
+ this.port = port;
+ return this;
+ }
+
+ public DatabaseConnector build() {
+ return new DatabaseConnector(username, password, url, port);
+ }
+}
diff --git a/design-pattern/src/main/java/com/geekyhacker/design/pattern/creational/DatabaseConnectorStepBuilder.java b/design-pattern/src/main/java/com/geekyhacker/design/pattern/creational/DatabaseConnectorStepBuilder.java
new file mode 100644
index 0000000..adc5570
--- /dev/null
+++ b/design-pattern/src/main/java/com/geekyhacker/design/pattern/creational/DatabaseConnectorStepBuilder.java
@@ -0,0 +1,70 @@
+package com.geekyhacker.design.pattern.creational;
+
+public class DatabaseConnectorStepBuilder {
+ private DatabaseConnectorStepBuilder() {
+ }
+
+ public static UsernameBuilder newBuilder() {
+ return new Builder();
+ }
+
+ public interface UsernameBuilder {
+ PasswordBuilder withUsername(String username);
+ }
+
+ public interface PasswordBuilder {
+ UrlBuilder withPassword(String password);
+ }
+
+ public interface UrlBuilder {
+ PortBuilder withUrl(String url);
+ }
+
+ public interface PortBuilder {
+ BuildStep withPort(int port);
+ }
+
+ public interface BuildStep {
+ DatabaseConnector build();
+ }
+
+ private static class Builder implements UsernameBuilder, PasswordBuilder, UrlBuilder, PortBuilder, BuildStep {
+ private String username;
+ private String password;
+ private String url;
+ private int port;
+
+ private Builder() {
+
+ }
+
+ @Override
+ public PasswordBuilder withUsername(String username) {
+ this.username = username;
+ return this;
+ }
+
+ @Override
+ public UrlBuilder withPassword(String password) {
+ this.password = password;
+ return this;
+ }
+
+ @Override
+ public PortBuilder withUrl(String url) {
+ this.url = url;
+ return this;
+ }
+
+ @Override
+ public BuildStep withPort(int port) {
+ this.port = port;
+ return this;
+ }
+
+ @Override
+ public DatabaseConnector build() {
+ return new DatabaseConnector(username, password, url, port);
+ }
+ }
+}
diff --git a/design-pattern/src/test/java/com/geekyhacker/design/pattern/creational/DatabaseConnectorBuilderTest.java b/design-pattern/src/test/java/com/geekyhacker/design/pattern/creational/DatabaseConnectorBuilderTest.java
new file mode 100644
index 0000000..bf0ca43
--- /dev/null
+++ b/design-pattern/src/test/java/com/geekyhacker/design/pattern/creational/DatabaseConnectorBuilderTest.java
@@ -0,0 +1,48 @@
+package com.geekyhacker.design.pattern.creational;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
+public class DatabaseConnectorBuilderTest {
+
+ @Test
+ void shouldBuildDatabaseConnectorFully() {
+ DatabaseConnector connector = DatabaseConnectorBuilder.newBuilder()
+ .withUsername("root")
+ .withPassword("secret")
+ .withUrl("localhost")
+ .withPort(3306)
+ .build();
+
+ assertEquals("root", connector.getUsername());
+ assertEquals("secret", connector.getPassword());
+ assertEquals("localhost", connector.getUrl());
+ assertEquals(3306, connector.getPort());
+ }
+
+ @Test
+ void shouldBuildDatabaseConnectorWithoutUrl() {
+ DatabaseConnector connector = DatabaseConnectorBuilder.newBuilder()
+ .withUsername("root")
+ .withPassword("secret")
+ .withPort(3306)
+ .build();
+
+ assertEquals("root", connector.getUsername());
+ assertEquals("secret", connector.getPassword());
+ assertEquals(3306, connector.getPort());
+ assertNull(connector.getUrl());
+ }
+
+ @Test
+ void shouldBuildDatabaseConnectorWithoutAnyParameter() {
+ DatabaseConnector connector = DatabaseConnectorBuilder.newBuilder().build();
+
+ assertNull(connector.getUsername());
+ assertNull(connector.getPassword());
+ assertNull(connector.getUrl());
+ assertEquals(0, connector.getPort());
+ }
+}
diff --git a/design-pattern/src/test/java/com/geekyhacker/design/pattern/creational/DatabaseConnectorStepBuilderTest.java b/design-pattern/src/test/java/com/geekyhacker/design/pattern/creational/DatabaseConnectorStepBuilderTest.java
new file mode 100644
index 0000000..7c059bf
--- /dev/null
+++ b/design-pattern/src/test/java/com/geekyhacker/design/pattern/creational/DatabaseConnectorStepBuilderTest.java
@@ -0,0 +1,23 @@
+package com.geekyhacker.design.pattern.creational;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class DatabaseConnectorStepBuilderTest {
+
+ @Test
+ void shouldBuildDatabaseConnector() {
+ DatabaseConnector connector = DatabaseConnectorStepBuilder.newBuilder()
+ .withUsername("root")
+ .withPassword("secret")
+ .withUrl("localhost")
+ .withPort(3306)
+ .build();
+
+ assertEquals("root", connector.getUsername());
+ assertEquals("secret", connector.getPassword());
+ assertEquals("localhost", connector.getUrl());
+ assertEquals(3306, connector.getPort());
+ }
+}
diff --git a/pom.xml b/pom.xml
index 9cae1df..029331e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -14,5 +14,6 @@
cryptography
jdbc
spring-boot
+ design-pattern