diff --git a/patterns/design-patterns-creational/src/main/java/com/baeldung/prototype/PineTree.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/prototype/PineTree.java new file mode 100644 index 0000000000..03f0ebfe7f --- /dev/null +++ b/patterns/design-patterns-creational/src/main/java/com/baeldung/prototype/PineTree.java @@ -0,0 +1,23 @@ +package com.baeldung.prototype; + +public class PineTree extends Tree { + + private String type; + + public PineTree(double mass, double height) { + super(mass, height); + this.type = "Pine"; + } + + public String getType() { + return type; + } + + @Override + public Tree copy() { + PineTree pineTreeClone = new PineTree(this.getMass(), this.getHeight()); + pineTreeClone.setPosition(this.getPosition()); + return pineTreeClone; + } + +} diff --git a/patterns/design-patterns-creational/src/main/java/com/baeldung/prototype/PlasticTree.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/prototype/PlasticTree.java new file mode 100644 index 0000000000..aea805dd47 --- /dev/null +++ b/patterns/design-patterns-creational/src/main/java/com/baeldung/prototype/PlasticTree.java @@ -0,0 +1,23 @@ +package com.baeldung.prototype; + +public class PlasticTree extends Tree { + + private String name; + + public PlasticTree(double mass, double height) { + super(mass, height); + this.name = "PlasticTree"; + } + + public String getName() { + return name; + } + + @Override + public Tree copy() { + PlasticTree plasticTreeClone = new PlasticTree(this.getMass(), this.getHeight()); + plasticTreeClone.setPosition(this.getPosition()); + return plasticTreeClone; + } + +} diff --git a/patterns/design-patterns-creational/src/main/java/com/baeldung/prototype/Tree.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/prototype/Tree.java index f95d568647..dffb573057 100644 --- a/patterns/design-patterns-creational/src/main/java/com/baeldung/prototype/Tree.java +++ b/patterns/design-patterns-creational/src/main/java/com/baeldung/prototype/Tree.java @@ -1,6 +1,6 @@ package com.baeldung.prototype; -public class Tree implements Cloneable { +public abstract class Tree { private double mass; private double height; @@ -35,20 +35,10 @@ public class Tree implements Cloneable { return position; } - @Override - public Tree clone() { - Tree tree = null; - try { - tree = (Tree) super.clone(); - } catch (CloneNotSupportedException e) { - e.printStackTrace(); - } - return tree; - } - @Override public String toString() { return "Tree [mass=" + mass + ", height=" + height + ", position=" + position + "]"; } + public abstract Tree copy(); } diff --git a/patterns/design-patterns-creational/src/test/java/com/baeldung/prototype/TreePrototypeUnitTest.java b/patterns/design-patterns-creational/src/test/java/com/baeldung/prototype/TreePrototypeUnitTest.java index 0d06da53d6..1fb1fbfea6 100644 --- a/patterns/design-patterns-creational/src/test/java/com/baeldung/prototype/TreePrototypeUnitTest.java +++ b/patterns/design-patterns-creational/src/test/java/com/baeldung/prototype/TreePrototypeUnitTest.java @@ -2,23 +2,67 @@ package com.baeldung.prototype; import static org.junit.jupiter.api.Assertions.assertEquals; +import java.util.Arrays; +import java.util.List; +import static java.util.stream.Collectors.toList; + import org.junit.jupiter.api.Test; public class TreePrototypeUnitTest { @Test - public void givenATreePrototypeWhenClonedThenCreateA_Clone() { + public void givenAPlasticTreePrototypeWhenClonedThenCreateA_Clone() { double mass = 10.0; double height = 3.7; Position position = new Position(3, 7); Position otherPosition = new Position(4, 8); - Tree tree = new Tree(mass, height); - tree.setPosition(position); - Tree anotherTree = tree.clone(); - anotherTree.setPosition(otherPosition); + PlasticTree plasticTree = new PlasticTree(mass, height); + plasticTree.setPosition(position); + PlasticTree anotherPlasticTree = (PlasticTree) plasticTree.copy(); + anotherPlasticTree.setPosition(otherPosition); - assertEquals(position, tree.getPosition()); - assertEquals(otherPosition, anotherTree.getPosition()); + assertEquals(position, plasticTree.getPosition()); + assertEquals(otherPosition, anotherPlasticTree.getPosition()); + + } + + @Test + public void givenAPineTreePrototypeWhenClonedThenCreateA_Clone() { + double mass = 10.0; + double height = 3.7; + Position position = new Position(3, 7); + Position otherPosition = new Position(4, 8); + + PineTree pineTree = new PineTree(mass, height); + pineTree.setPosition(position); + PineTree anotherPineTree = (PineTree) pineTree.copy(); + anotherPineTree.setPosition(otherPosition); + + assertEquals(position, pineTree.getPosition()); + assertEquals(otherPosition, anotherPineTree.getPosition()); + } + + @Test + public void givenA_ListOfTreesWhenClonedThenCreateListOfClones() { + double mass = 10.0; + double height = 3.7; + Position position = new Position(3, 7); + Position otherPosition = new Position(4, 8); + + PlasticTree plasticTree = new PlasticTree(mass, height); + plasticTree.setPosition(position); + PineTree pineTree = new PineTree(mass, height); + pineTree.setPosition(otherPosition); + + List trees = Arrays.asList(plasticTree, pineTree); + + List treeClones = trees.stream().map(Tree::copy).collect(toList()); + + Tree plasticTreeClone = treeClones.get(0); + + assertEquals(mass, plasticTreeClone.getMass()); + assertEquals(height, plasticTreeClone.getHeight()); + assertEquals(position, plasticTreeClone.getPosition()); } }