源码先锋

源码先锋

工厂方法模式原来还可以这样理解

admin 76 168

更多java文章与项目资源、毕业设计

工厂方法模式

5-1工厂方法讲解

5-2工厂方法coding

5-3工厂方法源码解析(jdk+logback)

5-1工厂方法讲解

5-2工厂方法coding

业务场景和之前的简单工厂一样,我们直接对简单工厂里面的代码进行改造:
还是一样一个Video类

publicabstractclassVideo{publicabstractvoidproduct();}123

Video类有两个子类:

把之前的工厂类改成一个抽象类,里面只留一个待实现的抽象方法:

publicabstractclassVideoFactory{publicabstractVideogetVideo();}123


产品等级和产品族是区分工厂方法和抽象方法的重要概念;

创建一个创建JavaVideoFactory的工厂类,继承于VideoFactory这个抽象类:

publicclassJavaVideoFactoryextsVideoFactory{@OverridepublicVideogetVideo(){returnnewJavaVideo();}}123456

同理,我们再创建一个PythonVideoFactory的工厂类:

publicclassPythonVideoFactoryextsVideoFactory{@OverridepublicVideogetVideo(){returnnewPythonVideo();}}123456

VideoFactory只定义一个默认的契约,具体创建哪一种对象由具体的子类工厂去实现:
测试如下:

publicclassTest{publicstaticvoidmain(String[]args){VideoFactoryvideoFactory=newJavaVideoFactory();Videovideo=();();}}1234567

测试结果:

如果我们想要创建出PythonVideo的实例,那么我们就只需要把VideoFactory的实例指向PythonVideoFactory工厂就可以了:

publicclassTest{publicstaticvoidmain(String[]args){VideoFactoryvideoFactory=newPythonVideoFactory();Videovideo=();();}}1234567

运行结果:


创建FEVideo:

创建一个创建FEVideo对象的工厂:

publicclassFEVideoFactoryextsVideoFactory{@OverridepublicVideogetVideo(){returnnewFEVideo();}}123456

现在的类图:


这里引出产品组的概念:

这个概念有点拗口,抽象工厂就是解决产品族的问题;

5-3工厂方法源码解析(jdk+logback)


如ArrayList里面的iterator方法


又如:
URLStreamHandlerFactory:


这个是它的是一个实现:

我们要理解
抽象工厂,子类的具体实现的工厂
抽象产品,子类的具体的产品

把抽象方法交给子类来进行实现;