一、定义: 定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行
二、类型: 创建型
三、适用场景:
创建对象需要大量重复的代码
客户端(应用层)不依赖于产品类实例如何被创建、实现等细节
一个类通过其子类来指定创建哪个对象
四、优点:
用户只需要关心所需要产品对应的工厂,无须关心创建细节。
加入新的产品符合开闭原则,提高可扩展性
五、缺点:
类的个数容易过多,增加复杂度
增加了系统的抽象性和理解难度
增加了系统的抽象性和理解难度
六、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); }
作者:Work Hard Work Smart
出处:http://www.cnblogs.com/linlf03/
欢迎任何形式的转载,未经作者同意,请保留此段声明!