设计模式 - 简单工厂
目录
- End -
- 个人学习笔记 -
- 概念
- 编码
- 实例
- 简单工厂
- 反射
- 源码
概念
-
定义:由一个工厂对象决定创建出哪一种产品类的实例
-
适用场景:工厂类负责创建的对象比较少;应用层只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心
-
优点:只需要传入一个正确的参数,就可以获取所需要的对象而无需知道其创建细节
-
缺点:工厂类职责相对过重,增加新的产品需要修改工厂类的判断逻辑,违背开闭原则
-
简单工厂并不属于23种设计模式,其更像是一种编码风格和习惯
-
使用简单工厂的一些类:
Calendar、DriverManager、LoggerFactory
编码
实例
Video.java
/**
* @Description 视频
* @date Dec 20, 2021
* @version 1.0
*/
public abstract class Video {
/**
* 生产方式
*/
public abstract void produce();
}
JavaVideo.java
/**
* @Description Java课程
* @date Dec 20, 2021
* @version 1.0
*/
public class JavaVideo extends Video {
@Override
public void produce() {
System.out.println("录制Java课程视频");
}
}
PythonVideo.java
/**
* @Description Python课程
* @date Dec 20, 2021
* @version 1.0
*/
public class PythonVideo extends Video {
@Override
public void produce() {
System.out.println("录制Python课程视频");
}
}
Test.java
/**
* @Description 测试类
* @date Dec 20, 2021
* @version 1.0
*/
public class Test {
public static void main(String[] args) {
Video video = new JavaVideo();
video.produce();
video = new PythonVideo();
video.produce();
}
}
- 输出:
录制Java课程视频
录制Python课程视频
- 类图如下:
简单工厂
- 使应用层不依赖具体的实现类
VideoFactory.java
/**
* @Description Video工厂
* @date Dec 21, 2021
* @version 1.0
*/
public class VideoFactory {
/**
* 获取Video
* @param type
* @return
*/
public Video getVideo(String type) {
if ("java".equalsIgnoreCase(type)) {
return new JavaVideo();
} else if ("python".equalsIgnoreCase(type)) {
return new PythonVideo();
}
return null;
}
}
Test.java
/**
* @Description 简单工厂测试类
* @date Dec 20, 2021
* @version 1.0
*/
public class Test {
public static void main(String[] args) {
VideoFactory videoFactory = new VideoFactory();
Video video = videoFactory.getVideo("java");
if (video == null) {
return;
}
video.produce();
video = videoFactory.getVideo("python");
if (video == null) {
return;
}
video.produce();
}
}
- 输出:
录制Java课程视频
录制Python课程视频
- 类图如下:
- 具体的生产过程都放在在
VideoFactory
中,Test
只管直接使用,但简单工厂的缺点体现无疑
反射
- 利用反射从一定程度上满足开闭原则
VideoFactory.java
/**
* @Description Video工厂
* @date Dec 21, 2021
* @version 1.0
*/
public class VideoFactory {
/**
* 获取Video
* 利用反射从一定程度上满足开闭原则
* @param c
* @return
*/
public Video getVideo(Class c) {
Video video = null;
try {
video = (Video) Class.forName(c.getName()).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return video;
}
}
Test.java
/**
* @Description 简单工厂测试类
* @date Dec 20, 2021
* @version 1.0
*/
public class Test {
public static void main(String[] args) {
VideoFactory videoFactory = new VideoFactory();
Video video = videoFactory.getVideo(JavaVideo.class);
if (video == null) {
return;
}
video.produce();
video = videoFactory.getVideo(PythonVideo.class);
if (video == null) {
return;
}
video.produce();
}
}
- 输出:
录制Java课程视频
录制Python课程视频
源码
GitHub
:https://github.com/Maggieq8324/design_pattern.git