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(); }
(3)两个食物接口的实现类【分别是苹果和面条】
package com.example.javabaisc.factory.staticfactory.origin; public class Apple implements Food { @Override public void getFood() { System.out.println("apple"); } }
package com.example.javabaisc.factory.staticfactory.origin; public class Noodles implements Food { @Override public void getFood() { System.out.println("Noodles"); } }
(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; } } }
(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(); } } }
(6)运行,打印结果