八吨车 记录所学,在校大二,软件工程,欢迎一起交流

工厂模式及在源码中的实践

工厂模式在\(\color{red}{接口}\)\(\color{red}{抽象方法}\)中定义了创建对象的方法,而将具体的创建对象的过程在\(\color{red}{子类}\)中实现,用户只需通过接口创建需要的对象即可,不用关注对象的具体创建过程。工厂模式本质上就是用工厂方法代替new操作创建一种实例化对象的不同方法。

先来看类图
![在这里插入图片描述]( https://img-blog.csdnimg.cn/20200417212002207.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDYzMzI3NQ==,size_16,color_FFFFFF,t_70)
具体代码:
Video类(产品)

public abstract class Video {
    public abstract void produce();
}

JavaVideo类(具体产品)

public class JavaVideo extends Video {
    @Override
    public void produce() {
        System.out.println("录制Java课程视频");
    }
}

PythonVideo类(具体产品)

public class PythonVideo extends Video {
    @Override
    public void produce() {
        System.out.println("录制Python课程视频");
    }
}

VideoFactory类(创建者抽象类)

public abstract class VideoFactory {
    public abstract Video getVideo();
}

JavaVideoFactory(具体的创建者)

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();
    }
}

![在这里插入图片描述]( https://img-blog.csdnimg.cn/2020041721370730.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDYzMzI3NQ,size_16,color_FFFFFF,t_70)
假如现在需要扩展CVideo的方法,那么不用修改原来的类,扩展Video的子类和VideoFactory的子类即可
![在这里插入图片描述]( https://img-blog.csdnimg.cn/20200417213921192.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDYzMzI3NQ
,size_16,color_FFFFFF,t_70)

下面来看下在源码中工厂模式的实现:
在Collection接口中定义了Iterator工厂方法,其有很多的实现类
在这里插入图片描述
例如在ArrayList的iterator方法,就是用了工厂模式,在这里
Collection就是一个抽象工厂(相当于VideoFactory)
ArrayList就是一个具体的实现工厂(相当于JavaVideoFactory)
Iterator就是一个抽象产品(相当于Video)
Itr就是一个具体的产品(相当于JavaVideo)
![在这里插入图片描述]( https://img-blog.csdnimg.cn/20200417220223931.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDYzMzI3NQ,size_16,color_FFFFFF,t_70)
再来看看URLStreamHandlerFactory,也是用了工厂模式
![在这里插入图片描述]( https://img-blog.csdnimg.cn/2020041722263315.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDYzMzI3NQ
,size_16,color_FFFFFF,t_70)
![在这里插入图片描述]( https://img-blog.csdnimg.cn/20200417222833835.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDYzMzI3NQ,size_16,color_FFFFFF,t_70)
![在这里插入图片描述]( https://img-blog.csdnimg.cn/20200417223202812.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDYzMzI3NQ
,size_16,color_FFFFFF,t_70)
![在这里插入图片描述]( https://img-blog.csdnimg.cn/20200417223340419.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDYzMzI3NQ,size_16,color_FFFFFF,t_70)
![在这里插入图片描述]( https://img-blog.csdnimg.cn/20200417223447130.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDYzMzI3NQ
,size_16,color_FFFFFF,t_70)
URLStreamHandlerFactory是一个抽象工厂(相当于VideoFactory)
其实现方法交给它的子类Factory内部类来实现
Factory是一个具体的实现工厂(相当于是JavaVideoFactory)
URLStreamHandler是一个抽象产品(相当于Video)
Handler类是一个具体的产品(相当于JavaVideo)

在ILoggerFactory接口中也一样,具体就不分析了,和上面的异曲同工
![在这里插入图片描述]( https://img-blog.csdnimg.cn/20200417224820229.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDYzMzI3NQ,size_16,color_FFFFFF,t_70)
![在这里插入图片描述]( https://img-blog.csdnimg.cn/20200417225017540.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDYzMzI3NQ
,size_16,color_FFFFFF,t_70)

posted @ 2020-05-22 22:27  八吨车  阅读(281)  评论(0)    收藏  举报