详谈 Java工厂 ---工厂方法模式
2024-08-28 00:30:46
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)运行,打印结果
最新文章
- mysql的优化
- linux vim
- Css Study - 纵向Menu - By html and Css
- (旧)子数涵数·PS ——素描效果
- C#委托和事件讲解
- 跟我学习dubbo-简介(1)
- C++向main函数传递参数的方法(实例已上传至github)
- 解决eclipse创建Maven项目后无法生成src/main/java资源文件夹的方法
- TempDB 中表变量和局部临时表的对比
- SQL之运算符操作
- python_爬校花图片
- Hibernate入门这一篇就够了
- Buzzsumo大型教程(内容营销+外链outreach必备)营销神器
- Java基础6-多态;匿名内部类;适配器模式
- mysql in 排序 也可以按in里面的顺序来排序
- kafka安装步骤
- Centos不能上外网解决
- 神经网络的BP算法
- POJ 2681
- 解决提交按钮在IE浏览器正常在360浏览器不可用
热门文章
- 玩转 Mockjs,前端也能跑的很溜
- 04 - Vue3 UI Framework - 文档页
- pipeline input步骤
- [BUUCTF]PWN——[BJDCTF 2nd]secret
- CVE 2021-44228 Log4j-2命令执行复现及分析
- HTML body体
- PowerShell配置文件后门
- 【蓝桥杯】第十二届蓝桥杯砝码称重(Python题解)
- 【LeetCode】8. String to Integer (atoi) 字符串转换整数
- 【LeetCode】140. Word Break II 解题报告(Python & C++)