详谈 Java工厂 ---工厂方法模式

1.前言

  有个场景,消费者需要付钱,有可能是使用支付宝、微信、银行卡,那么该怎么选择呢?

是不是想到了使用用if else判断?还是使用switch?

  一个地方这样写还好,如果有很多这样的业务,难道都写一遍?我不想重复轮子,因此可以将他们都封装好,可以使用工厂模式将他们封装。

 什么是工厂模式?

  就是为了尽可能将代码的耦合度降低而产生的设计模式。

  这篇随笔讲解 工厂方法模式 的思路和具体操作。

2.总结

(1)工厂方法模式与静态工厂十分相似,甚至说思路基本一样,只是通过传入参数来选择不同的操作而已。
(2)是在静态工厂的基础上改进的模式。
(3)消费者只需要将关键词传给工厂,由工厂决定返回的内容。 (
4)优点:将相似的业务集成在一起,使用基本一样的操作完成不同的业务。 (5)缺点:如果需要修改业务,需要修改工厂内容,耦合度太高了。

3.操作

(1)目录结构

  

 (2)建一个食物接口【规定了允许对食物的操作方法】

package com.example.javabaisc.factory.staticfactory.origin;

public interface Food {
    public void getFood();
}
View Code

(3)两个食物接口的实现类【分别是苹果和面条】

package com.example.javabaisc.factory.staticfactory.origin;

public class Apple implements Food {
    @Override
    public void getFood() {
        System.out.println("apple");
    }
}
View Code
package com.example.javabaisc.factory.staticfactory.origin;

public class Noodles implements Food {
    @Override
    public void getFood() {
        System.out.println("Noodles");
    }
}
View Code

(4)工厂类【决定生产什么食物】

package com.example.javabaisc.factory.staticfactory.factory;

import com.example.javabaisc.factory.staticfactory.origin.Apple;
import com.example.javabaisc.factory.staticfactory.origin.Food;
import com.example.javabaisc.factory.staticfactory.origin.Noodles;

public class FoodFactory {
    public static String FF_Apple = "apple";
    public static String FF_Noodles = "noodles";

    public static Food getFood(String key) {
        if (key.equals(FF_Apple)) {
            return new Apple();
        } else if (key.equals(FF_Noodles)) {
            return new Noodles();
        } else {
            System.out.println("没有这种食物");
            return null;
        }

    }

}
View Code

(5)测试类

package com.example.javabaisc.factory.staticfactory;

import com.example.javabaisc.factory.staticfactory.factory.FoodFactory;
import com.example.javabaisc.factory.staticfactory.origin.Food;
import org.junit.jupiter.api.Test;

public class StFTest {
    @Test
    public void t(){

        //从工厂获取苹果
        Food food = FoodFactory.getFood(FoodFactory.FF_Apple);
        if (food != null){
            food.getFood();
        }
        //从工厂获取面条
        Food food2 = FoodFactory.getFood(FoodFactory.FF_Noodles);
        if (food2 != null){
            food2.getFood();
        }

    }

}
View Code

(6)运行,打印结果

原文地址:https://www.cnblogs.com/c2g5201314/p/13150194.html