设计模式精讲 | 笔记(四) | 工厂方法模式coding与源码分析

版权声明:本文为Coder编程原创文章,未经Coder编程允许不得转载。欢迎关注公众号:Coder编程 https://blog.csdn.net/Michael_HM/article/details/88388150

本章主要介绍工厂方法模式。

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

欢迎关注并点赞~

猜你喜欢

转载自blog.csdn.net/Michael_HM/article/details/88388150
今日推荐