Added the prototype pattern and its unit test
This commit is contained in:
parent
ee985d510b
commit
ba90059624
@ -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";
|
||||
}
|
||||
}
|
@ -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";
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
@ -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";
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user