设计模式 - 简单工厂
目录
- 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