工厂方法模式定义:
工厂方法模式(Factory Method Pattern)实际上就是简单工厂的升级,因简单工厂进行大规模的增加修改导致工厂类职责过重,不利于代码维护和扩展,所以衍生出工厂方法,该模式是指定义一个创建对象的接口,让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行,属于创建型模式。
使用场景:
1.创建对象需要大量的重复代码。
2.客户端(应用层)不依赖于产品类实例如何被创建.实现等细节。一个类通过其子类来指定创建哪个对象。
优点:
用户只需关心产品对应的工厂,无需关心创建细节。加入新产品符合开闭原则,提高了系统的扩展性。
缺点:
因为类的个数容易过多,增加了代码结构的复杂度,也增加了系统的抽象性和理解度。
示例:
// 最顶层产品工厂可任意扩展
public interface ProductFactory {
/**
* 专用生产产品
* @return 抽象产品
*/
Product create();
}
// 对应的工厂创建对应的产品
public class FanFactory implements ProductFactory {
@Override
public Product create() {
return new Fan();
}
}
// 对应的工厂创建对应的产品
public class TelevisionFactory implements ProductFactory {
@Override
public Product create() {
return new Television();
}
}
// 尽量面向抽象编程,定义规则
public interface Product {
void use();
}
public class Fan implements Product {
private final static Logger logger = Logger.getLogger(Fan.class);
@Override
public void use() {
logger.info("开启迷你风扇....");
}
}
public class Television implements Product {
private final static Logger logger = Logger.getLogger(Television.class);
@Override
public void use() {
logger.info("看综艺...");
}
}
public class MainExcute {
public static void main(String[] args) {
/*注:在简单工厂模式中是要传参,现在直接找工厂,子类负责创建。
具体创建交给对应的工厂,用户只关心要调用哪个工厂即可。*/
ProductFactory factory = new FanFactory();
Product product = factory.create();
product.use();
/*附:仔细看logback中的ILoggerFactory类图,发现也是用的工厂方法模式,可自己去看源码:
ILoggerFactory.getLogger()*/
}
}
结构:
image.png