简单工厂模式很简单,如果它能满足我们的需要,我觉得就不要折腾了。之所以需要引入工厂模式,是因为我们往往需要使用两个或两个以上的工厂。

    1. public interface FoodFactory {
    2. Food makeFood(String name);
    3. }
    4. public class ChineseFoodFactory implements FoodFactory {
    5. @Override
    6. public Food makeFood(String name) {
    7. if (name.equals("A")) {
    8. return new ChineseFoodA();
    9. } else if (name.equals("B")) {
    10. return new ChineseFoodB();
    11. } else {
    12. return null;
    13. }
    14. }
    15. }
    16. public class AmericanFoodFactory implements FoodFactory {
    17. @Override
    18. public Food makeFood(String name) {
    19. if (name.equals("A")) {
    20. return new AmericanFoodA();
    21. } else if (name.equals("B")) {
    22. return new AmericanFoodB();
    23. } else {
    24. return null;
    25. }
    26. }
    27. }

    其中,ChineseFoodA、ChineseFoodB、AmericanFoodA、AmericanFoodB 都派生自 Food。
    客户端调用:

    1. public class APP {
    2. public static void main(String[] args) {
    3. // 先选择一个具体的工厂
    4. FoodFactory factory = new ChineseFoodFactory();
    5. // 由第一步的工厂产生具体的对象,不同的工厂造出不一样的对象
    6. Food food = factory.makeFood("A");
    7. }
    8. }

    虽然都是调用 makeFood (“A”) 制作 A 类食物,但是,不同的工厂生产出来的完全不一样。
    第一步,我们需要选取合适的工厂,然后第二步基本上和简单工厂一样。
    核心在于,我们需要在第一步选好我们需要的工厂。比如,我们有 LogFactory 接口,实现类有 FileLogFactory 和 KafkaLogFactory,分别对应将日志写入文件和写入 Kafka 中,显然,我们客户端第一步就需要决定到底要实例化 FileLogFactory 还是 KafkaLogFactory,这将决定之后的所有的操作。
    虽然简单,不过我也把所有的构件都画到一张图上,这样读者看着比较清晰:
    image.png