23种设计模式——工厂模式

陌路散爱 提交于 2020-02-23 03:31:17

工厂模式

工厂模式:(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

  • 核心本质

    • 实例化对象不用 new,用工厂方法代替。
    • 将选择实现类,创建对象统一管理和控制。从而将调用者跟我们的实现类解耦。
  • 三种模式:

    • 简单工厂模式
      • 用来生产同一等级结构的任意产品。 (对于增加新的产品,需要覆盖已有代码)
    • 工厂方法模式
      • 用来生产同一等级结构中的固定产品。(支持增加任意产品)
    • 抽象工厂模式
      • 围绕一个超级工厂创建其他工厂。超级工厂又称为其他工厂的工厂。

1. 简单工厂模式

创建一个接口,

public interface Car {
   public void name();
}

编写类实现接口,

WuLing.class

public class WuLing implements Car {
    @Override
    public void name() {
        System.out.println("五菱宏光");
    }
}

Tesla .class

public class Tesla implements Car {
    @Override
    public void name() {
        System.out.println("特斯拉");
    }
}

编写调用类;

public class Consumer {
    public static void main(String[] args) {
        WuLing wuLing=new WuLing();
        Tesla tesla = new Tesla();
        wuLing.name();
        tesla.name();
    }
}

以上是我们经常写的代码,没有用到工厂模式。

改造
添加一个工厂类(相当于中间商),来实现实现类的初始化。

public class CarFactory {
    public static Car getCar(String car) {

        if ("五菱".equals(car)) {
            return new WuLing();
        } else if ("特斯拉".equals(car)) {
            return new Tesla();
        } else return null;
    }
}

这时我们的调用者应该这样写

public class Consumer {
    public static void main(String[] args) {
        Car wuling = CarFactory.getCar("五菱");
        Car tesla = CarFactory.getCar("特斯拉");

        wuling.name();
        tesla.name();
    }
}

这样就避免了new 实现了解耦。

缺点 缺点也很明显当我们想加一个功能时就要修改工厂类。

如何解决这一问题呢?

2.厂方法模式

工厂方法模式的工厂是一个接口,然后每个实现了创建一个各自的工厂实现这个接口工厂。
工厂接口

public interface CarFactory {
    Car getCar();
}

五菱要有一个自己的工厂。
WuLingFactory.class

public class WuLingFactory implements CarFactory {
    @Override
    public Car getCar() {
        return new WuLing();
    }
}

特斯拉也要有一个自己的工厂。
TeslaFactory.class

public class TeslaFactory implements CarFactory {
    @Override
    public Car getCar() {
        return new Tesla();
    }
}

这时调用者代码

public class Consumer {
    public static void main(String[] args) {

        Car tesla = new TeslaFactory().getCar();
        Car wuLing = new WuLingFactory().getCar();
        tesla.name();
        wuLing.name();
    }
}

这个好处为添加功能时不用修改代码。例如添加一台大众车。就只需要创建它的实现类和工厂就可以,不用修改工厂代码。

大众实现类:

public class DaZong {
    public void name() {
        System.out.println("大众");
    }
}

大众工厂z

public class DaZongFactory implements CarFactory {
    @Override
    public Car getCar() {
        return new DaZong();
    }
}

在提供者中添加
Car dazong = new DaZongFactory().getCar(); dazong.name();
就可以实现。

简单工厂和方法工厂对比

  • 结构复杂度: 简单工厂简单

  • 代码复杂度: 简单工厂简单

  • 编程复杂度: 简单工厂简单

  • 管理上的复杂度: 简单工厂简单

  • 根据设计原则: 工厂方法模式

  • 根据实际业务:简单工厂模式

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!