From f7d2e1e9259603cd756dc1d8477aab1ec4493816 Mon Sep 17 00:00:00 2001 From: mperor Date: Mon, 27 Jan 2025 09:55:29 +0100 Subject: [PATCH] Add prototype design pattern with test case --- DesignPatterns/README.md | 1 + .../pattern/creational/prototype/DNA.java | 4 + .../pattern/creational/prototype/Sheep.java | 74 +++++++++++++++++++ .../prototype/SheepPrototypeTest.java | 22 ++++++ 4 files changed, 101 insertions(+) create mode 100644 DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/prototype/DNA.java create mode 100644 DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/prototype/Sheep.java create mode 100644 DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/creational/prototype/SheepPrototypeTest.java diff --git a/DesignPatterns/README.md b/DesignPatterns/README.md index 8ef980b..4e13b79 100644 --- a/DesignPatterns/README.md +++ b/DesignPatterns/README.md @@ -15,6 +15,7 @@ This project explores various design patterns and their implementations in moder - [Factory](src/main/java/pl/mperor/lab/java/design/pattern/creational/factory) 🏭 - [Builder](src/main/java/pl/mperor/lab/java/design/pattern/creational/builder) 🏗️ +- [Prototype](src/main/java/pl/mperor/lab/java/design/pattern/creational/prototype) 🧬 - [Singleton](src/main/java/pl/mperor/lab/java/design/pattern/creational/singleton) 1️⃣ ### Structural Design Patterns 🎁 diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/prototype/DNA.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/prototype/DNA.java new file mode 100644 index 0000000..4cd1dfb --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/prototype/DNA.java @@ -0,0 +1,4 @@ +package pl.mperor.lab.java.design.pattern.creational.prototype; + +public record DNA(String sequence) { +} diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/prototype/Sheep.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/prototype/Sheep.java new file mode 100644 index 0000000..a179888 --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/prototype/Sheep.java @@ -0,0 +1,74 @@ +package pl.mperor.lab.java.design.pattern.creational.prototype; + +import java.time.Year; +import java.util.function.Function; + +public class Sheep { + + private String name; + private DNA dna; + private Year yearOfBirth; + private Breed breed; + + private Sheep(Sheep sheep) { + this.name = sheep.name; + this.dna = sheep.dna; + this.yearOfBirth = Year.now(); + this.breed = sheep.breed; + } + + public Sheep(String name, DNA dna, Year yearOfBirth, Breed breed) { + this.name = name; + this.dna = dna; + this.yearOfBirth = yearOfBirth; + this.breed = breed; + } + + String getName() { + return name; + } + + void setName(String name) { + this.name = name; + } + + DNA getDna() { + return dna; + } + + Year getYearOfBirth() { + return yearOfBirth; + } + + Breed getBreed() { + return breed; + } + + public Sheep clone(Function cloning) { + return cloning.apply(new CloneBuilder(new Sheep(this))); + } + + public class CloneBuilder { + private Sheep clone; + + public CloneBuilder(Sheep clone) { + this.clone = clone; + } + + public CloneBuilder name(String name) { + clone.name = name; + return this; + } + + public Sheep build() { + return clone; + } + } + + enum Breed { + MERINO, + SUFFOLK, + DORSET, + HAMPSHIRE + } +} diff --git a/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/creational/prototype/SheepPrototypeTest.java b/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/creational/prototype/SheepPrototypeTest.java new file mode 100644 index 0000000..cc157a1 --- /dev/null +++ b/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/creational/prototype/SheepPrototypeTest.java @@ -0,0 +1,22 @@ +package pl.mperor.lab.java.design.pattern.creational.prototype; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.time.Year; + +public class SheepPrototypeTest { + + @Test + public void testSheepCloning() { + Sheep originalSheep = new Sheep("Dolly", new DNA("AGCT"), Year.of(2010), Sheep.Breed.MERINO); + Sheep clonedSheep = originalSheep.clone(builder -> builder + .name("Molly") + .build() + ); + Assertions.assertNotSame(originalSheep, clonedSheep); + Assertions.assertSame(originalSheep.getDna(), clonedSheep.getDna()); + Assertions.assertSame(originalSheep.getBreed(), clonedSheep.getBreed()); + Assertions.assertNotEquals(originalSheep.getYearOfBirth(), clonedSheep.getYearOfBirth()); + } +} \ No newline at end of file