工厂模式的核心思想,其实就是不要自己在代码里手动new一个实现类对象出来,因为那样的话,调用方就不是面向接口编程了,你还得自己去 care 实现了。

    假设有 N 个 client 都 new 了一个 ProductImpl 出来,结果,到了后面某一天,你要把 ProductImpl 换成 ProductNewImpl 了,完全换一套实现逻辑,这个时候就完蛋了。你需要在 N 个 client 里,都修改 new ProductImpl() 这个方法,简直是一场灾难啊。尤其如果调用你的类的是别人呢?别人还得来 care 这个事情?

    所以一般都是用工厂的思想来提供所有实现类实例,然后调用方面向接口来编程即可,接口不变,调用方代码不用变;

    在真正的企业开发中,现在我们都很少自己做工厂实现了,因为有spring,spring的容器其实本质上就是个大工厂的概念,spring 会基于 xml 或者是注解,根据一些配置,去创建出来所有我们需要的这个类的实例,此时 spring 就相当于是个工厂;
    image.png

    1. package com.example.designpattern.factory;
    2. public class FactoryPatternDemo {
    3. public static void main(String[] args) {
    4. Product product = ProductFactory.create();
    5. product.execute();
    6. // 如果此时有100个地方都需要获取Product的实例
    7. // 但是此时Product实现类改了
    8. // 我们只要修改一个地方即可,就是ProductFactory中
    9. }
    10. public interface Product{
    11. void execute();
    12. }
    13. public static class ProductImpl1 implements Product {
    14. public void execute() {
    15. System.out.println("产品1的功能实现");
    16. }
    17. }
    18. public static class ProductImpl2 implements Product {
    19. public void execute() {
    20. System.out.println("产品2的功能实现");
    21. }
    22. }
    23. public static class ProductFactory {
    24. public static Product create(){
    25. return new ProductImpl2();
    26. }
    27. }
    28. }