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)运行,打印结果

最新文章

  1. mysql的优化
  2. linux vim
  3. Css Study - 纵向Menu - By html and Css
  4. (旧)子数涵数·PS ——素描效果
  5. C#委托和事件讲解
  6. 跟我学习dubbo-简介(1)
  7. C++向main函数传递参数的方法(实例已上传至github)
  8. 解决eclipse创建Maven项目后无法生成src/main/java资源文件夹的方法
  9. TempDB 中表变量和局部临时表的对比
  10. SQL之运算符操作
  11. python_爬校花图片
  12. Hibernate入门这一篇就够了
  13. Buzzsumo大型教程(内容营销+外链outreach必备)营销神器
  14. Java基础6-多态;匿名内部类;适配器模式
  15. mysql in 排序 也可以按in里面的顺序来排序
  16. kafka安装步骤
  17. Centos不能上外网解决
  18. 神经网络的BP算法
  19. POJ 2681
  20. 解决提交按钮在IE浏览器正常在360浏览器不可用

热门文章

  1. 玩转 Mockjs,前端也能跑的很溜
  2. 04 - Vue3 UI Framework - 文档页
  3. pipeline input步骤
  4. [BUUCTF]PWN——[BJDCTF 2nd]secret
  5. CVE 2021-44228 Log4j-2命令执行复现及分析
  6. HTML body体
  7. PowerShell配置文件后门
  8. 【蓝桥杯】第十二届蓝桥杯砝码称重(Python题解)
  9. 【LeetCode】8. String to Integer (atoi) 字符串转换整数
  10. 【LeetCode】140. Word Break II 解题报告(Python & C++)