From bcb84ad34d38b188ee1bf6cf2a06d56d93472662 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=E5=98=89=E9=98=B3?= Date: Sun, 23 Sep 2018 16:33:59 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AE=80=E5=8D=95=E5=B7=A5=E5=8E=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../simplefactory/AbstractVideo.java | 11 +++++ .../simplefactory/JavaAbstractVideo.java | 15 +++++++ .../simplefactory/PythonAbstractVideo.java | 15 +++++++ .../simplefactory/VideoFactory.java | 42 +++++++++++++++++++ .../simplefactory/AbstractVideoTest.java | 37 ++++++++++++++++ 5 files changed, 120 insertions(+) create mode 100644 src/main/java/top/fjy8018/designpattern/pattern/creational/simplefactory/AbstractVideo.java create mode 100644 src/main/java/top/fjy8018/designpattern/pattern/creational/simplefactory/JavaAbstractVideo.java create mode 100644 src/main/java/top/fjy8018/designpattern/pattern/creational/simplefactory/PythonAbstractVideo.java create mode 100644 src/main/java/top/fjy8018/designpattern/pattern/creational/simplefactory/VideoFactory.java create mode 100644 src/test/java/top/fjy8018/designpattern/pattern/creational/simplefactory/AbstractVideoTest.java diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/simplefactory/AbstractVideo.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/simplefactory/AbstractVideo.java new file mode 100644 index 0000000..ae328ae --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/creational/simplefactory/AbstractVideo.java @@ -0,0 +1,11 @@ +package top.fjy8018.designpattern.pattern.creational.simplefactory; + +/** + * 简单工厂 + * + * @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/simplefactory/JavaAbstractVideo.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/simplefactory/JavaAbstractVideo.java new file mode 100644 index 0000000..f95d683 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/creational/simplefactory/JavaAbstractVideo.java @@ -0,0 +1,15 @@ +package top.fjy8018.designpattern.pattern.creational.simplefactory; + +import lombok.extern.slf4j.Slf4j; + +/** + * @author F嘉阳 + * @date 2018-09-23 16:13 + */ +@Slf4j +public class JavaAbstractVideo extends AbstractVideo { + @Override + public void produce() { + log.info("生产Java视频"); + } +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/simplefactory/PythonAbstractVideo.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/simplefactory/PythonAbstractVideo.java new file mode 100644 index 0000000..975c8c9 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/creational/simplefactory/PythonAbstractVideo.java @@ -0,0 +1,15 @@ +package top.fjy8018.designpattern.pattern.creational.simplefactory; + +import lombok.extern.slf4j.Slf4j; + +/** + * @author F嘉阳 + * @date 2018-09-23 16:14 + */ +@Slf4j +public class PythonAbstractVideo extends AbstractVideo { + @Override + public void produce() { + log.info("生产Python视频"); + } +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/simplefactory/VideoFactory.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/simplefactory/VideoFactory.java new file mode 100644 index 0000000..cb8a04a --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/creational/simplefactory/VideoFactory.java @@ -0,0 +1,42 @@ +package top.fjy8018.designpattern.pattern.creational.simplefactory; + +/** + * @author F嘉阳 + * @date 2018-09-23 16:16 + */ +public class VideoFactory { + + /** + * 由工厂负责创建类,业务层无需关心具体实现 + * 其缺点是不符合开闭原则,即如果具体实现类扩展后,工厂类也必须修改 + * + * @param type + * @return + */ + public AbstractVideo getVideo(String type) { + switch (type) { + case "Java": + return new JavaAbstractVideo(); + case "Python": + return new PythonAbstractVideo(); + default: + return null; + } + } + + /** + * 通过反射在一定程度弥补简单工厂不足(开闭原则) + * + * @param c + * @return + */ + public AbstractVideo getVideo(Class c) { + AbstractVideo video = null; + try { + video = (AbstractVideo) Class.forName(c.getName()).newInstance(); + } catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) { + e.printStackTrace(); + } + return video; + } +} diff --git a/src/test/java/top/fjy8018/designpattern/pattern/creational/simplefactory/AbstractVideoTest.java b/src/test/java/top/fjy8018/designpattern/pattern/creational/simplefactory/AbstractVideoTest.java new file mode 100644 index 0000000..a37c65a --- /dev/null +++ b/src/test/java/top/fjy8018/designpattern/pattern/creational/simplefactory/AbstractVideoTest.java @@ -0,0 +1,37 @@ +package top.fjy8018.designpattern.pattern.creational.simplefactory; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class AbstractVideoTest { + + /** + * 不使用简单工厂,则业务层需要引入具体的实现类 + */ + @Test + void before() { + AbstractVideo video = new JavaAbstractVideo(); + video.produce(); + } + + /** + * 使用简单工厂后业务层无需导入具体的实现类,即不关心具体实现过程 + */ + @Test + void after() { + VideoFactory factory = new VideoFactory(); + AbstractVideo video = factory.getVideo("Java"); + video.produce(); + } + + /** + * 通过传递类名方式改进扩展性问题 + */ + @Test + void improve() { + VideoFactory factory = new VideoFactory(); + AbstractVideo video = factory.getVideo(JavaAbstractVideo.class); + video.produce(); + } +} \ No newline at end of file