From ebe859cf5a7abd2a4c9fda9511c7ee929965902c Mon Sep 17 00:00:00 2001 From: Pramod Patil Date: Mon, 18 Sep 2023 19:38:40 +0530 Subject: [PATCH 1/4] Builder pattern with and without fields duplication --- .../builder/DatabaseConfigurationBuilder.java | 54 ++++++++++++++++++ ...rationBuilderWithoutFieldsDuplication.java | 57 +++++++++++++++++++ 2 files changed, 111 insertions(+) create mode 100644 src/main/java/com/scaler/lld/design/assignments/builder/DatabaseConfigurationBuilderWithoutFieldsDuplication.java diff --git a/src/main/java/com/scaler/lld/design/assignments/builder/DatabaseConfigurationBuilder.java b/src/main/java/com/scaler/lld/design/assignments/builder/DatabaseConfigurationBuilder.java index 592aa32..b727d1d 100644 --- a/src/main/java/com/scaler/lld/design/assignments/builder/DatabaseConfigurationBuilder.java +++ b/src/main/java/com/scaler/lld/design/assignments/builder/DatabaseConfigurationBuilder.java @@ -2,5 +2,59 @@ @WithBuilder public class DatabaseConfigurationBuilder { + private String databaseUrl; + private String username; + private String password; + private int maxConnections; + private boolean enableCache; + private boolean isReadOnly; + private DatabaseConfigurationBuilder() { + } + + public static class Builder { + private String databaseUrl; + private String username; + private String password; + private int maxConnections; + private boolean enableCache; + private boolean isReadOnly; + + public Builder() { + } + + public DatabaseConfiguration build() { + return new DatabaseConfiguration(databaseUrl, username, password, maxConnections, enableCache, isReadOnly); + } + + public Builder setDatabaseUrl(String databaseUrl) { + this.databaseUrl = databaseUrl; + return this; + } + + public Builder setUsername(String username) { + this.username = username; + return this; + } + + public Builder setPassword(String password) { + this.password = password; + return this; + } + + public Builder setMaxConnections(int maxConnections) { + this.maxConnections = maxConnections; + return this; + } + + public Builder setEnableCache(boolean enableCache) { + this.enableCache = enableCache; + return this; + } + + public Builder setReadOnly(boolean readOnly) { + isReadOnly = readOnly; + return this; + } + } } \ No newline at end of file diff --git a/src/main/java/com/scaler/lld/design/assignments/builder/DatabaseConfigurationBuilderWithoutFieldsDuplication.java b/src/main/java/com/scaler/lld/design/assignments/builder/DatabaseConfigurationBuilderWithoutFieldsDuplication.java new file mode 100644 index 0000000..9b744a2 --- /dev/null +++ b/src/main/java/com/scaler/lld/design/assignments/builder/DatabaseConfigurationBuilderWithoutFieldsDuplication.java @@ -0,0 +1,57 @@ +package com.scaler.lld.design.assignments.builder; + +@WithBuilder +public class DatabaseConfigurationBuilderWithoutFieldsDuplication { + private String databaseUrl; + private String username; + private String password; + private int maxConnections; + private boolean enableCache; + private boolean isReadOnly; + + private DatabaseConfigurationBuilderWithoutFieldsDuplication() { + } + + public static class Builder { + private DatabaseConfigurationBuilderWithoutFieldsDuplication instance; + public Builder() { + instance = new DatabaseConfigurationBuilderWithoutFieldsDuplication(); + } + + public DatabaseConfiguration build() { + //return new object instead of "instance" variable due to immutability advantage. + return new DatabaseConfiguration(instance.databaseUrl, instance.username, instance.password, + instance.maxConnections, instance.enableCache, instance.isReadOnly); + } + + public Builder setDatabaseUrl(String databaseUrl) { + instance.databaseUrl = databaseUrl; + return this; + } + + public Builder setUsername(String username) { + instance.username = username; + return this; + } + + public Builder setPassword(String password) { + instance.password = password; + return this; + } + + public Builder setMaxConnections(int maxConnections) { + instance.maxConnections = maxConnections; + return this; + } + + public Builder setEnableCache(boolean enableCache) { + instance.enableCache = enableCache; + return this; + } + + public Builder setReadOnly(boolean readOnly) { + instance.isReadOnly = readOnly; + return this; + } + } +} \ No newline at end of file From 264de3860f8cdb50d96fc1b3340f92bfbe7e848d Mon Sep 17 00:00:00 2001 From: Pramod Patil Date: Mon, 18 Sep 2023 19:59:14 +0530 Subject: [PATCH 2/4] Builder pattern with and without fields duplication --- .../builder/DatabaseConfigurationBuilder.java | 23 ++++++++++------ ...rationBuilderWithoutFieldsDuplication.java | 26 ++++++++++++------- 2 files changed, 31 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/scaler/lld/design/assignments/builder/DatabaseConfigurationBuilder.java b/src/main/java/com/scaler/lld/design/assignments/builder/DatabaseConfigurationBuilder.java index b727d1d..731e5b2 100644 --- a/src/main/java/com/scaler/lld/design/assignments/builder/DatabaseConfigurationBuilder.java +++ b/src/main/java/com/scaler/lld/design/assignments/builder/DatabaseConfigurationBuilder.java @@ -23,36 +23,43 @@ public static class Builder { public Builder() { } - public DatabaseConfiguration build() { - return new DatabaseConfiguration(databaseUrl, username, password, maxConnections, enableCache, isReadOnly); + public DatabaseConfigurationBuilder build() { + DatabaseConfigurationBuilder outerClassObj = new DatabaseConfigurationBuilder(); + outerClassObj.databaseUrl = databaseUrl; + outerClassObj.username = username; + outerClassObj.password = password; + outerClassObj.maxConnections = maxConnections; + outerClassObj.enableCache = enableCache; + outerClassObj.isReadOnly = isReadOnly; + return outerClassObj; } - public Builder setDatabaseUrl(String databaseUrl) { + public Builder url(String databaseUrl) { this.databaseUrl = databaseUrl; return this; } - public Builder setUsername(String username) { + public Builder username(String username) { this.username = username; return this; } - public Builder setPassword(String password) { + public Builder password(String password) { this.password = password; return this; } - public Builder setMaxConnections(int maxConnections) { + public Builder maxConnections(int maxConnections) { this.maxConnections = maxConnections; return this; } - public Builder setEnableCache(boolean enableCache) { + public Builder enableCache(boolean enableCache) { this.enableCache = enableCache; return this; } - public Builder setReadOnly(boolean readOnly) { + public Builder readOnly(boolean readOnly) { isReadOnly = readOnly; return this; } diff --git a/src/main/java/com/scaler/lld/design/assignments/builder/DatabaseConfigurationBuilderWithoutFieldsDuplication.java b/src/main/java/com/scaler/lld/design/assignments/builder/DatabaseConfigurationBuilderWithoutFieldsDuplication.java index 9b744a2..9c2c2d6 100644 --- a/src/main/java/com/scaler/lld/design/assignments/builder/DatabaseConfigurationBuilderWithoutFieldsDuplication.java +++ b/src/main/java/com/scaler/lld/design/assignments/builder/DatabaseConfigurationBuilderWithoutFieldsDuplication.java @@ -1,6 +1,6 @@ package com.scaler.lld.design.assignments.builder; -@WithBuilder +//@WithBuilder public class DatabaseConfigurationBuilderWithoutFieldsDuplication { private String databaseUrl; private String username; @@ -18,38 +18,44 @@ public Builder() { instance = new DatabaseConfigurationBuilderWithoutFieldsDuplication(); } - public DatabaseConfiguration build() { + public DatabaseConfigurationBuilderWithoutFieldsDuplication build() { //return new object instead of "instance" variable due to immutability advantage. - return new DatabaseConfiguration(instance.databaseUrl, instance.username, instance.password, - instance.maxConnections, instance.enableCache, instance.isReadOnly); + DatabaseConfigurationBuilderWithoutFieldsDuplication outerClassObj = new DatabaseConfigurationBuilderWithoutFieldsDuplication(); + outerClassObj.databaseUrl = instance.databaseUrl; + outerClassObj.username = instance.username; + outerClassObj.password = instance.password; + outerClassObj.maxConnections = instance.maxConnections;; + outerClassObj.enableCache = instance.enableCache; + outerClassObj.isReadOnly = instance.isReadOnly; + return outerClassObj; } - public Builder setDatabaseUrl(String databaseUrl) { + public Builder url(String databaseUrl) { instance.databaseUrl = databaseUrl; return this; } - public Builder setUsername(String username) { + public Builder username(String username) { instance.username = username; return this; } - public Builder setPassword(String password) { + public Builder password(String password) { instance.password = password; return this; } - public Builder setMaxConnections(int maxConnections) { + public Builder maxConnections(int maxConnections) { instance.maxConnections = maxConnections; return this; } - public Builder setEnableCache(boolean enableCache) { + public Builder enableCache(boolean enableCache) { instance.enableCache = enableCache; return this; } - public Builder setReadOnly(boolean readOnly) { + public Builder readOnly(boolean readOnly) { instance.isReadOnly = readOnly; return this; } From c6adeab987f2c388287591f66732a167c33bdf41 Mon Sep 17 00:00:00 2001 From: Pramod Patil Date: Thu, 21 Sep 2023 16:37:40 +0530 Subject: [PATCH 3/4] Prototype implementation --- .../assignments/prototype/Configuration.java | 7 ++++- .../ConfigurationPrototypeRegistryImpl.java | 28 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/scaler/lld/design/assignments/prototype/ConfigurationPrototypeRegistryImpl.java diff --git a/src/main/java/com/scaler/lld/design/assignments/prototype/Configuration.java b/src/main/java/com/scaler/lld/design/assignments/prototype/Configuration.java index 597f36e..7c7599a 100644 --- a/src/main/java/com/scaler/lld/design/assignments/prototype/Configuration.java +++ b/src/main/java/com/scaler/lld/design/assignments/prototype/Configuration.java @@ -1,6 +1,6 @@ package com.scaler.lld.design.assignments.prototype; -public class Configuration { +public class Configuration implements ClonableObject { private String themeColor; private Boolean autoSave; private String language; @@ -46,4 +46,9 @@ public String getFontFamily() { public ConfigurationType getType() { return type; } + + @Override + public Configuration cloneObject() { + return new Configuration(themeColor, autoSave, language, darkMode, fontSize, fontFamily, type); + } } \ No newline at end of file diff --git a/src/main/java/com/scaler/lld/design/assignments/prototype/ConfigurationPrototypeRegistryImpl.java b/src/main/java/com/scaler/lld/design/assignments/prototype/ConfigurationPrototypeRegistryImpl.java new file mode 100644 index 0000000..be7943b --- /dev/null +++ b/src/main/java/com/scaler/lld/design/assignments/prototype/ConfigurationPrototypeRegistryImpl.java @@ -0,0 +1,28 @@ +package com.scaler.lld.design.assignments.prototype; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +public class ConfigurationPrototypeRegistryImpl implements ConfigurationPrototypeRegistry { + Map configurationRegistry = new HashMap<>(); + + @Override + public void addPrototype(Configuration user) { + configurationRegistry.put(user.getType(), user); + } + + @Override + public Configuration getPrototype(ConfigurationType type) { + return configurationRegistry.get(type); + } + + @Override + public Configuration clone(ConfigurationType type) { + Configuration configuration = getPrototype(type); + if(Objects.nonNull(configuration)) { + return configuration.cloneObject(); + } + return null; + } +} From c3faa031a1a1ff38e19773113e5a9dfadd0a7724 Mon Sep 17 00:00:00 2001 From: Pramod Patil Date: Thu, 21 Sep 2023 17:34:38 +0530 Subject: [PATCH 4/4] Singleton Assignment --- .../FileBasedConfigurationManagerImpl.java | 38 +++++++++++-------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/scaler/lld/design/assignments/singleton/FileBasedConfigurationManagerImpl.java b/src/main/java/com/scaler/lld/design/assignments/singleton/FileBasedConfigurationManagerImpl.java index 15470fc..5189555 100644 --- a/src/main/java/com/scaler/lld/design/assignments/singleton/FileBasedConfigurationManagerImpl.java +++ b/src/main/java/com/scaler/lld/design/assignments/singleton/FileBasedConfigurationManagerImpl.java @@ -1,50 +1,58 @@ package com.scaler.lld.design.assignments.singleton; +import java.util.Objects; + public class FileBasedConfigurationManagerImpl extends FileBasedConfigurationManager { + private static FileBasedConfigurationManagerImpl instance; + + private FileBasedConfigurationManagerImpl() { + super(); + } + @Override public String getConfiguration(String key) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'getConfiguration'"); + return properties.getProperty(key); } @Override public T getConfiguration(String key, Class type) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'getConfiguration'"); + String propertyValue = properties.getProperty(key); + if(propertyValue == null) { + return null; + } + return convert(propertyValue, type); } @Override public void setConfiguration(String key, String value) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'setConfiguration'"); + properties.setProperty(key, value); } @Override public void setConfiguration(String key, T value) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'setConfiguration'"); + properties.setProperty(key, String.valueOf(value)); } @Override public void removeConfiguration(String key) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'removeConfiguration'"); + properties.remove(key); } @Override public void clear() { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'clear'"); + properties.clear(); } public static FileBasedConfigurationManager getInstance() { - // TODO Auto-generated method stub - return null; + if(Objects.isNull(instance)) { + instance = new FileBasedConfigurationManagerImpl(); + } + return instance; } public static void resetInstance() { - // TODO Auto-generated method stub + instance = null; } } \ No newline at end of file