【笔记】简单工厂模式

简单工厂模式

定义

  • 由一个工厂对象决定创建出哪一种产品类的实例

类型

  • 创建型,但不属于GOF23种设计模式

适用场景

  • 工厂类负责创建的对象比较少
  • 客户端(应用层)只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心

优点

  • 只需要传入一个正确的参数,就可以获取你所知道的对象,而无需知道其创建的细节

缺点

  • 工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,违背开闭原则

源码中的应用

  • JDK Calendar.getInstance
  • slf4j ILoggerFactory.getLogger

代码示例

/**
 * 简单工厂
 */
public class SimpleFactory {
    public static void main(String[] args) {
        Video video = VideoFactory.getVideo("java");
        if (video == null) return;
        video.produce();

        Video video1 = VideoFactory.getVideo(PythonVideo.class);
        video1.produce();
    }
}

/**
 * 视频
 */
abstract class Video {
    public abstract void produce();
}

class JavaVideo extends Video {

    @Override
    public void produce() {
        System.out.println("录制java课程视频");
    }
}

class PythonVideo extends Video {

    @Override
    public void produce() {
        System.out.println("录制Python课程视频");
    }
}

/**
 * 视频工厂
 */
class VideoFactory {

    /**
     * 普通用法
     *
     * @param type
     * @return
     */
    public static Video getVideo(String type) {
        if ("java".equals(type)) {
            return new JavaVideo();
        } else if ("python".equals(type)) {
            return new PythonVideo();
        } else {
            return null;
        }
    }

    /**
     * 通过反射
     *
     * @param c
     * @return
     */
    public static 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;
    }
}

你可能感兴趣的:(设计模式)