Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions design-pattern/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Related articles
66 changes: 66 additions & 0 deletions design-pattern/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.geekyhacker.design-pattern</groupId>
<artifactId>geeky-hacker-design-pattern</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>geeky-hacker-design-pattern</name>
<url>https://geekyhacker.com</url>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>21</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.14.0</version>
</dependency>

<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.10.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.10.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>5.11.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>5.11.0</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.13.0</version>
<configuration>
<source>21</source>
<target>21</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.2.5</version>
</plugin>
</plugins>
</build>
</project>
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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);
}
}
}
Original file line number Diff line number Diff line change
@@ -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());
}
}
Original file line number Diff line number Diff line change
@@ -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());
}
}
1 change: 1 addition & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,6 @@
<module>cryptography</module>
<module>jdbc</module>
<module>spring-boot</module>
<module>design-pattern</module>
</modules>
</project>