工厂模式及在源码中的实践
工厂模式在\(\color{red}{接口}\)或\(\color{red}{抽象方法}\)中定义了创建对象的方法,而将具体的创建对象的过程在\(\color{red}{子类}\)中实现,用户只需通过接口创建需要的对象即可,不用关注对象的具体创建过程。工厂模式本质上就是用工厂方法代替new操作创建一种实例化对象的不同方法。
先来看类图
具体代码:
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();
}
}
假如现在需要扩展CVideo的方法,那么不用修改原来的类,扩展Video的子类和VideoFactory的子类即可
下面来看下在源码中工厂模式的实现:
在Collection接口中定义了Iterator工厂方法,其有很多的实现类
例如在ArrayList的iterator方法,就是用了工厂模式,在这里
Collection就是一个抽象工厂(相当于VideoFactory)
ArrayList就是一个具体的实现工厂(相当于JavaVideoFactory)
Iterator就是一个抽象产品(相当于Video)
Itr就是一个具体的产品(相当于JavaVideo)
再来看看URLStreamHandlerFactory,也是用了工厂模式
URLStreamHandlerFactory是一个抽象工厂(相当于VideoFactory)
其实现方法交给它的子类Factory内部类来实现
Factory是一个具体的实现工厂(相当于是JavaVideoFactory)
URLStreamHandler是一个抽象产品(相当于Video)
Handler类是一个具体的产品(相当于JavaVideo)
在ILoggerFactory接口中也一样,具体就不分析了,和上面的异曲同工