Implementing Factory Pattern With Generics in Java (#12895)
* Implementing the factory pattern with generics. * Did some modifications. Also added unit test. * Changed the package name.
This commit is contained in:
parent
ff3f356fcd
commit
2879088ee7
|
@ -0,0 +1,11 @@
|
||||||
|
package com.baeldung.factoryGeneric;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
public class DateNotifier implements Notifier<Date> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void notify(Date date) {
|
||||||
|
System.out.println("Notifying: " + date);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
package com.baeldung.factoryGeneric;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
class Main {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
NotifierFactory factory = new NotifierFactory();
|
||||||
|
Notifier<String> stringNotifier = factory.getNotifier(String.class);
|
||||||
|
Notifier<Date> dateNotifier = factory.getNotifier(Date.class);
|
||||||
|
|
||||||
|
stringNotifier.notify("Hello world!");
|
||||||
|
dateNotifier.notify(new Date());
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
package com.baeldung.factoryGeneric;
|
||||||
|
|
||||||
|
public interface Notifier<T> {
|
||||||
|
|
||||||
|
void notify(T obj);
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
package com.baeldung.factoryGeneric;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
public class NotifierFactory {
|
||||||
|
|
||||||
|
public <T> Notifier<T> getNotifier(Class<T> c) {
|
||||||
|
if (c == String.class) {
|
||||||
|
return Record.STRING.make();
|
||||||
|
}
|
||||||
|
if (c == Date.class) {
|
||||||
|
return Record.DATE.make();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
package com.baeldung.factoryGeneric;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
public enum Record {
|
||||||
|
STRING {
|
||||||
|
@Override
|
||||||
|
public Notifier<String> make() {
|
||||||
|
return new StringNotifier();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
DATE {
|
||||||
|
@Override
|
||||||
|
public Notifier<Date> make() {
|
||||||
|
return new DateNotifier();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
public abstract <T> Notifier<T> make();
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
package com.baeldung.factoryGeneric;
|
||||||
|
|
||||||
|
public class StringNotifier implements Notifier<String> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void notify(String str) {
|
||||||
|
System.out.println("Notifying: " + str);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
package com.baeldung.factoryGeneric;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
// Unit test for the NotifierFactory class.
|
||||||
|
public class FactoryGenericUnitTest {
|
||||||
|
|
||||||
|
// Checks that when the factory is asked to provide a string notifier, the object is an actual string notifier.
|
||||||
|
@Test
|
||||||
|
public void givenStringNotifier_whenEquals_thenTrue() {
|
||||||
|
NotifierFactory factory = new NotifierFactory();
|
||||||
|
Notifier<String> stringNotifier = factory.getNotifier(String.class);
|
||||||
|
|
||||||
|
assertNotNull(stringNotifier, "The object returned by the factory is null!");
|
||||||
|
assertTrue(stringNotifier instanceof Notifier<?>, "The object returned by the factory is not a notifier!");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Checks that when the factory is asked to provide a date notifier, the object is an actual date notifier.
|
||||||
|
@Test
|
||||||
|
public void givenDateNotifier_whenEquals_thenTrue() {
|
||||||
|
NotifierFactory factory = new NotifierFactory();
|
||||||
|
Notifier<Date> dateNotifier = factory.getNotifier(Date.class);
|
||||||
|
|
||||||
|
assertNotNull(dateNotifier, "The object returned by the factory is null!");
|
||||||
|
assertTrue(dateNotifier instanceof Notifier<?>, "The object returned by the factory is not a notifier!");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Checks that when the factory is asked to provide both a date notifier and a string notifier, the objects returned are different.
|
||||||
|
@Test
|
||||||
|
public void givenDateNotifierAndStringNotifier_whenEquals_thenFalse() {
|
||||||
|
NotifierFactory factory = new NotifierFactory();
|
||||||
|
Notifier<String> stringNotifier = factory.getNotifier(String.class);
|
||||||
|
Notifier<Date> dateNotifier = factory.getNotifier(Date.class);
|
||||||
|
|
||||||
|
assertNotNull(stringNotifier, "The object returned by the factory is null!");
|
||||||
|
assertNotNull(dateNotifier, "The object returned by the factory is null!");
|
||||||
|
assertNotEquals(stringNotifier, dateNotifier, "The string notifier and date notifier objects returned by the factory are actually the same!");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue