本章主要介绍工厂方法模式。
1.方法工厂模式介绍:
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的课程视频
如何还有一个Spring视频,我们就可以这样来做:
创建一个SpringVideo:
/**
* @author Merlin
* @Title: SpringVideo
* @ProjectName java-base-learning
* @Description: spring课程视频
* @date 2019/3/414:59
*/
public class SpringVideo extends Video {
@Override
public void produce() {
System.out.println("录制Spring课程视频");
}
}
接着创建SpringVideo工厂对象:
/**
* @author Merlin
* @Title: SpringVideoFactory
* @ProjectName java-base-learning
* @Description: Spring视频工厂类
* @date 2019/3/415:00
*/
public class SpringVideoFactory extends VideoFactory{
@Override
public Video getVideo() {
return new SpringVideo();
}
}
目前的类图:
这里引出产品组的概念:
例如说,幕课的视频就是教程,但是后续网站规定你有了视频之后,还要有对应的手记,这两个打包在一起,在可以称之为教程,那对于Python,Java或者是Spring来说:Java的视频,Java的手记,他们都属于Java,他们属于同一产品族,而Java的视频,Python的视频,Spring的视频来说,他们属于同一产品等级;
抽象工厂就是解决产品族的问题。
3. 工厂方法模式结合实例源码分析:
ArrayList里面的iterator方法:
URLStreamHandlerFactory:
URLStreamHandler子类实现:
我们要理解
抽象工厂,子类的具体实现的工厂
抽象产品,子类的具体的产品
把抽象方法交给子类来进行实现。
主要来源:geely老师设计模式视频
相关代码:
Github地址:https://github.com/CoderMerlin/java-base-learning/tree/master/java-design-learning
欢迎关注并点赞~