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