5-1 工厂方法讲解
5-2 工厂方法coding
业务场景和之前的简单工厂一样,我们直接对简单工厂里面的代码进行改造:
还是一样一个Video类
public abstract class Video {
public abstract void product();
}
Video类有两个子类:
public class JavaVideo extends Video {
@Override
public void product() {
System.out.println("录制Java课程视频");
}
}
public class PythonVideo extends Video {
@Override
public void product() {
System.out.println("录制Python的课程视频");
}
}
把之前的工厂类改成一个抽象类,里面只留一个待实现的抽象方法:
public abstract class VideoFactory {
public abstract Video getVideo();
}
Java视频和Pytho视频都是同一个产品等级,都是视频’这里要理解一个概念:相同类型的一个产品,我们称之为产品等级,他们的等级都是在视频的这个等级上;
产品等级和产品族是区分工厂方法和抽象方法的重要概念;
创建一个创建JavaVideoFactory的工厂类,继承于VideoFactory这个抽象类:
public class JavaVideoFactory extends VideoFactory {
@Override
public Video getVideo() {
return new JavaVideo();
}
}
同理,我们再创建一个PythonVideoFactory的工厂类:
public class PythonVideoFactory extends VideoFactory {
@Override
public Video getVideo() {
return new PythonVideo();
}
}
VideoFactory只定义一个默认的契约,具体创建哪一种对象由具体的子类工厂去实现:
测试如下:
public class Test {
public static void main(String[]args){
VideoFactory videoFactory = new JavaVideoFactory();
Video video = videoFactory.getVideo();
video.product();
}
}
测试结果:
录制Java课程视频
如果我们想要创建出PythonVideo的实例,那么我们就只需要把VideoFactory的实例指向PythonVideoFactory工厂就可以了:
public class Test {
public static void main(String[]args){
VideoFactory videoFactory = new PythonVideoFactory();
Video video = videoFactory.getVideo();
video.product();
}
}
运行结果:
录制Python的课程视频
如何还有一个前端视频,我们就可以这样来做:
创建FEVideo:
public class FEVideo extends Video {
@Override
public void product() {
System.out.println("录制前端课程视频");
}
}
创建一个创建FEVideo对象的工厂:
public class FEVideoFactory extends VideoFactory {
@Override
public Video getVideo() {
return new FEVideo();
}
}
现在的类图:
这里引出产品组的概念:
例如说,幕课的视频就是教程,但是后续网站规定你有了视频之后,还要有对应的手记,这两个打包在一起,在可以称之为教程,那对于Python,Java或者是FE来说:Java的视频,Java的手记,他们都属于Java,他们属于同一产品族,而Java的视频,Python的视频,FE的视频来说,他们属于同一产品等级;
这个概念有点拗口,抽象工厂就是解决产品族的问题;
5-3 工厂方法源码解析(jdk+logback)
如ArrayList里面的iterator方法
又如:
URLStreamHandlerFactory:
这个是它的是一个实现:
我们要理解
抽象工厂,子类的具体实现的工厂
抽象产品,子类的具体的产品
把抽象方法交给子类来进行实现;