Added the prototype pattern and its unit test

This commit is contained in:
Abhijay Kumar 2019-05-21 14:14:43 +05:30
parent ee985d510b
commit ba90059624
6 changed files with 122 additions and 0 deletions

View File

@ -0,0 +1,13 @@
package src.main.java.com.designpatterns.creational.prototype;
class BlackColor extends Color {
BlackColor() {
this.colorName = "black";
}
@Override
public String addColor() {
return "Black color added";
}
}

View File

@ -0,0 +1,15 @@
package src.main.java.com.designpatterns.creational.prototype;
class BlueColor extends Color {
BlueColor() {
this.colorName = "blue";
}
@Override
public String addColor() {
return "Blue color added";
}
}

View File

@ -0,0 +1,34 @@
package src.main.java.com.designpatterns.creational.prototype;
/**
* The prototype pattern is used when the type of objects to create is determined by a prototypical instance, which
* is cloned to produce new objects. <p>
* This pattern is used to:
* 1. avoid subclasses of an object creator in the client application, like the factory method pattern does.
* 2. avoid the inherent cost of creating a new object in the standard way (e.g., using the 'new' keyword) when it is
* prohibitively expensive for a given application.
*
* @see <a href="https://en.wikipedia.org/wiki/Prototype_pattern">Prototype Pattern</a>
*/
public abstract class Color implements Cloneable {
String colorName;
public abstract String addColor();
/**
* This method should be called from the client instead of writing code that invokes the "new" operator on a
* hard-coded class name.
*
* @return a clone for the object
*/
public Object clone() {
Object clone = null;
try {
clone = super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return clone;
}
}

View File

@ -0,0 +1,18 @@
package src.main.java.com.designpatterns.creational.prototype;
import java.util.HashMap;
import java.util.Map;
public class ColorStore {
private static Map<String, Color> colorMap = new HashMap<>();
static {
colorMap.put("blue", new BlueColor());
colorMap.put("black", new BlackColor());
colorMap.put("red", new RedColor());
}
public static Color getColor(String colorName) {
return (Color) colorMap.get(colorName).clone();
}
}

View File

@ -0,0 +1,13 @@
package src.main.java.com.designpatterns.creational.prototype;
class RedColor extends Color {
RedColor() {
this.colorName = "red";
}
@Override
public String addColor() {
return "Red color added";
}
}

View File

@ -0,0 +1,29 @@
package src.test.java.com.designpatterns.creational.prototype;
import org.junit.Assert;
import org.junit.Test;
import src.main.java.com.designpatterns.creational.prototype.ColorStore;
public class PrototypeTest {
@Test
public void testPrototype() {
String testFailReason = "";
String testOne = ColorStore.getColor("blue").addColor();
if (!"Blue color added".equals(testOne)) {
testFailReason += "TC 1 Failed: Blue couldn't be added\n";
}
String testTwo = ColorStore.getColor("black").addColor();
if (!"Black color added".equals(testTwo)) {
testFailReason += "TC 2 Failed: Black couldn't be added\n";
}
String testThree = ColorStore.getColor("red").addColor();
if (!"Red color added".equals(testThree)) {
testFailReason += "TC 3 Failed: Red couldn't be added\n";
}
String testFour = ColorStore.getColor("blue").addColor();
if (!"Blue color added".equals(testFour)) {
testFailReason += "TC 4 Failed: Blue couldn't be added\n";
}
Assert.assertEquals(testFailReason, "", testFailReason);
}
}