java设计模式精讲 Debug 方式+内存分析 第5章 工厂方法模式

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:
在这里插入图片描述
这个是它的是一个实现:
在这里插入图片描述

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

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

猜你喜欢

转载自blog.csdn.net/weixin_37778801/article/details/84309498
今日推荐