java设计模式——工厂模式

一. 定义与类型

定义:定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行

类型:创建型

二. 使用场景

创建对象需要大量重复的代码

客户端(应用层)不依赖于产品类实例如何被创建,实现等细节

一个类通过其子类来指定创建哪个类

三. 优缺点

优点:用户只需要关系所需产品对应的工厂,无需关心创建细节,加入新产品符合开闭原则,提高可扩展性

缺点:类的个数容易过多,增加复杂度,增加了系统的抽象行和理解难度

四. coding

我们还是以上一篇的简单工厂的video为例。在原来的基础上做一定的修改,符合开闭原则。

/**
 * @program: designModel
 * @description:
 * @author: YuKai Fan
 * @create: 2018-11-13 16:50
 **/
public abstract class VideoFactory {

    public abstract Video getVideo();

}

抽象工厂类中的具体工厂对象video(这个也是抽象的,只是对于抽象工厂来说,是具体的)

/**
 * @program: designModel
 * @description: 视频类
 * @author: YuKai Fan
 * @create: 2018-11-13 16:46
 **/
public abstract class Video {
    public abstract void product();
}

具体的实体类,是继承video:

/**
 * @program: designModel
 * @description: java视频类
 * @author: YuKai Fan
 * @create: 2018-11-13 16:47
 **/
public class JavaVideo extends Video {
    public void product() {
        System.out.println("录制java课程视频");
    }
}
/**
 * @program: designModel
 * @description: Python视频类
 * @author: YuKai Fan
 * @create: 2018-11-13 16:48
 **/
public class PythonVideo extends Video {
    public void product() {
        System.out.println("录制Python课程视频");
    }
}

具体的工厂类,是用来创建具体的实体对象的:

/**
 * @program: designModel
 * @description:
 * @author: YuKai Fan
 * @create: 2018-11-21 11:05
 **/
public class JavaVideoFactory extends VideoFactory {
    public Video getVideo() {
        return new JavaVideo();
    }
}
/**
 * @program: designModel
 * @description:
 * @author: YuKai Fan
 * @create: 2018-11-21 11:06
 **/
public class PythonVideoFactory extends VideoFactory {
    public Video getVideo() {
        return new PythonVideo();
    }
}

客户端:

/**
 * @program: designModel
 * @description:
 * @author: YuKai Fan
 * @create: 2018-11-13 16:48
 **/
public class Test {
    public static void main(String[] args) {
        VideoFactory videoFactory = new JavaVideoFactory();
        Video video = videoFactory.getVideo();
        video.product();
    }
}

UML类图:

五. 源码分析

jdk中的集合框架Collect中的Iterate方法就是采用抽象工厂的方式实现,还是日志矿机的logback的getLogger也是。

原文地址:https://www.cnblogs.com/FanJava/p/9965138.html