工厂模式的核心思想,其实就是不要自己在代码里手动new一个实现类对象出来,因为那样的话,调用方就不是面向接口编程了,你还得自己去 care 实现了。
假设有 N 个 client 都 new 了一个 ProductImpl 出来,结果,到了后面某一天,你要把 ProductImpl 换成 ProductNewImpl 了,完全换一套实现逻辑,这个时候就完蛋了。你需要在 N 个 client 里,都修改 new ProductImpl() 这个方法,简直是一场灾难啊。尤其如果调用你的类的是别人呢?别人还得来 care 这个事情?
所以一般都是用工厂的思想来提供所有实现类实例,然后调用方面向接口来编程即可,接口不变,调用方代码不用变;
在真正的企业开发中,现在我们都很少自己做工厂实现了,因为有spring,spring的容器其实本质上就是个大工厂的概念,spring 会基于 xml 或者是注解,根据一些配置,去创建出来所有我们需要的这个类的实例,此时 spring 就相当于是个工厂;
package com.example.designpattern.factory;
public class FactoryPatternDemo {
public static void main(String[] args) {
Product product = ProductFactory.create();
product.execute();
// 如果此时有100个地方都需要获取Product的实例
// 但是此时Product实现类改了
// 我们只要修改一个地方即可,就是ProductFactory中
}
public interface Product{
void execute();
}
public static class ProductImpl1 implements Product {
public void execute() {
System.out.println("产品1的功能实现");
}
}
public static class ProductImpl2 implements Product {
public void execute() {
System.out.println("产品2的功能实现");
}
}
public static class ProductFactory {
public static Product create(){
return new ProductImpl2();
}
}
}