一、定义: 定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行
二、类型: 创建型
三、适用场景:
创建对象需要大量重复的代码
客户端(应用层)不依赖于产品类实例如何被创建、实现等细节
一个类通过其子类来指定创建哪个对象
四、优点:
用户只需要关心所需要产品对应的工厂,无须关心创建细节。
加入新的产品符合开闭原则,提高可扩展性
五、缺点:
类的个数容易过多,增加复杂度
增加了系统的抽象性和理解难度
增加了系统的抽象性和理解难度
六、Code
对简单工厂进行改造
1. Video类
public abstract class Video {
public abstract void produce();
}
2. JavaVideo类
public class JavaVideo extends Video {
@Override
public void produce() {
System.out.println("录制Java视频");
}
}
3. AndroidVideo类
public class AndroidVideo extends Video {
@Override
public void produce() {
System.out.println("录制Android视频");
}
}
4. VideoFactory 类。 这是一个抽象类
public abstract class VideoFactory {
public abstract Video getVideo();
}
5. JavaVideoFactory 类
public class JavaVideoFactory extends VideoFactory{
@Override
public Video getVideo() {
return new JavaVideo();
}
}
6.AndroidVideoFactory 类
public class AndroidVideoFactory extends VideoFactory{
@Override
public Video getVideo() {
return new AndroidVideo();
}
}
7. JavaScriptFactory 类
public class JavaScriptFactory extends VideoFactory {
@Override
public Video getVideo() {
return new JavaScriptVideo();
}
}
8. 测试类
public class Test {
public static void main(String[] args) {
VideoFactory videoFactory = new JavaVideoFactory();
Video video = videoFactory.getVideo();
video.produce();
videoFactory = new AndroidVideoFactory();
video = videoFactory.getVideo();
video.produce();
videoFactory = new JavaScriptFactory();
video = videoFactory.getVideo();
video.produce();
}
}
9. UML图

九、工厂方法在JDK中的实例
1. Collection类中的Iterator<E> iterator();方法是一个工厂方法
Collection的实现ArrayList类中的iterator方法
public Iterator<E> iterator() {
return new Itr();
}
ArrayList可以被认为是实现工厂
2. URLStreamHandlerFactory接口
public interface URLStreamHandlerFactory {
URLStreamHandler createURLStreamHandler(String var1);
}
Factory 类实现了URLStreamHandlerFactory接口接口
private static class Factory implements URLStreamHandlerFactory {
private static String PREFIX = "sun.net.www.protocol";
private Factory() {
}
public URLStreamHandler createURLStreamHandler(String var1) {
String var2 = PREFIX + "." + var1 + ".Handler";
try {
Class var3 = Class.forName(var2);
return (URLStreamHandler)var3.newInstance();
} catch (ReflectiveOperationException var4) {
throw new InternalError("could not load " + var1 + "system protocol handler", var4);
}
}
}
3. slf4j中的LoggerFactory类中的getLogger方法
public static Logger getLogger(String name) {
ILoggerFactory iLoggerFactory = getILoggerFactory();
return iLoggerFactory.getLogger(name);
}