diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/AbstractVideo.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/AbstractVideo.java new file mode 100644 index 0000000..070fa52 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/AbstractVideo.java @@ -0,0 +1,11 @@ +package top.fjy8018.designpattern.pattern.creational.factorymethod; + +/** + * 工厂方法 + * + * @author F嘉阳 + * @date 2018-09-23 16:13 + */ +public abstract class AbstractVideo { + public abstract void produce(); +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/AbstractVideoFactory.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/AbstractVideoFactory.java new file mode 100644 index 0000000..984ba08 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/AbstractVideoFactory.java @@ -0,0 +1,21 @@ +package top.fjy8018.designpattern.pattern.creational.factorymethod; + +import sun.misc.Launcher; + +import java.util.Collection; + +/** + * 定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中 + * 工厂方法抽象类,只提供契约,对于已知的逻辑可以提供默认实现 + *

+ * 提高产品与产品族的拓展性 + *

+ * JDK源码样例1:{@link java.net.URLStreamHandlerFactory#createURLStreamHandler(String)} -> {@link Launcher.Factory#createURLStreamHandler(String)} + * JDK源码样例2:{@link Collection#iterator()} + * + * @author F嘉阳 + * @date 2018-09-23 16:16 + */ +public abstract class AbstractVideoFactory { + public abstract AbstractVideo getVideo(); +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/JavaAbstractVideoFactory.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/JavaAbstractVideoFactory.java new file mode 100644 index 0000000..30d5e73 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/JavaAbstractVideoFactory.java @@ -0,0 +1,12 @@ +package top.fjy8018.designpattern.pattern.creational.factorymethod; + +/** + * @author F嘉阳 + * @date 2018-09-23 20:11 + */ +public class JavaAbstractVideoFactory extends AbstractVideoFactory { + @Override + public AbstractVideo getVideo() { + return new JavaVideo(); + } +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/JavaVideo.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/JavaVideo.java new file mode 100644 index 0000000..1a5c7ba --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/JavaVideo.java @@ -0,0 +1,17 @@ +package top.fjy8018.designpattern.pattern.creational.factorymethod; + +import lombok.extern.slf4j.Slf4j; + +/** + * 具体的产品 + * + * @author F嘉阳 + * @date 2018-09-23 16:13 + */ +@Slf4j +public class JavaVideo extends AbstractVideo { + @Override + public void produce() { + log.info("生产Java视频"); + } +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/PythonAbstractVideoFactory.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/PythonAbstractVideoFactory.java new file mode 100644 index 0000000..810bfc9 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/PythonAbstractVideoFactory.java @@ -0,0 +1,12 @@ +package top.fjy8018.designpattern.pattern.creational.factorymethod; + +/** + * @author F嘉阳 + * @date 2018-09-23 20:11 + */ +public class PythonAbstractVideoFactory extends AbstractVideoFactory { + @Override + public AbstractVideo getVideo() { + return new PythonVideo(); + } +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/PythonVideo.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/PythonVideo.java new file mode 100644 index 0000000..6f46c58 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/PythonVideo.java @@ -0,0 +1,17 @@ +package top.fjy8018.designpattern.pattern.creational.factorymethod; + +import lombok.extern.slf4j.Slf4j; + +/** + * 具体的产品 + * + * @author F嘉阳 + * @date 2018-09-23 16:14 + */ +@Slf4j +public class PythonVideo extends AbstractVideo { + @Override + public void produce() { + log.info("生产Python视频"); + } +} diff --git a/src/test/java/top/fjy8018/designpattern/pattern/creational/factorymethod/AbstractVideoFactoryTest.java b/src/test/java/top/fjy8018/designpattern/pattern/creational/factorymethod/AbstractVideoFactoryTest.java new file mode 100644 index 0000000..bd16759 --- /dev/null +++ b/src/test/java/top/fjy8018/designpattern/pattern/creational/factorymethod/AbstractVideoFactoryTest.java @@ -0,0 +1,12 @@ +package top.fjy8018.designpattern.pattern.creational.factorymethod; + +import org.junit.jupiter.api.Test; + +class AbstractVideoFactoryTest { + + @Test + void getVideo() { + AbstractVideoFactory factory = new JavaAbstractVideoFactory(); + factory.getVideo().produce(); + } +} \ No newline at end of file