详谈 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();
}
(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)运行,打印结果

详谈 Java工厂 ---工厂方法模式的更多相关文章
- Java设计模式の模版方法模式
概述 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的 ...
- 设计模式(java)--模版方法模式之任务分配
转自:http://blog.csdn.net/zhengzhb/article/details/7405608 定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构 ...
- Java设计模式(二) 工厂方法模式
本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...
- JAVA设计模式--工厂方法模式
工厂方法设计模式 抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关.是具体工厂角色必须实现的接口或者必须继承的父类.在java中它由抽象类或者接口来实现.具体工厂角色:它含有和具体业务逻辑有关 ...
- Java设计模式3:工厂方法模式
工厂方法模式 工厂方法模式是类的创建模式.工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工厂推迟到子类中. 工厂方法模式 工厂方法模式是对简单工厂模式进一步抽象的结果. 假如是不使用反 ...
- java设计模式(二)---工厂方法模式
2普通工厂方法模式 就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建. 2.1创建接口 /** * 发送接口 * Created by mrf on 2016/2/25. */ public ...
- java 23 - 1 设计模式之工厂方法模式
转载: JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)
- JAVA设计模式之工厂方法模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述工厂方法模式的: 工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymor ...
- [改善Java代码]用枚举实现工厂方法模式更简洁
工厂方法模式(Factory Method Patter)是"创建对象的接口",让子类决定实例化哪一个类,并使一个类的实例化延迟到其子类.工厂方法模式在我们的开发工作中,经常会用到 ...
随机推荐
- 什么是maven(二)
转自博主--一杯凉茶 maven项目构建ssh工程(父工程与子模块的拆分与聚合) 前一节我们明白了maven是个什么玩意,这一节就来讲讲他的一个重要的应用场景,也就是通过maven将一个ssh项目 ...
- I/O流之字节流
在程序中所有的数据都是以流的形式进行传输或保存的,程序需要数据时要使用输入流读取数据,而当程序需要将一些数据保存起来时,就要使用输出流完成对于操作文件内容,要进行文件内容的操作就需要通过Java提供的 ...
- Jenkins监控
目录 一.Monitoring插件 二.Prometheus监控 一.Monitoring插件 Monitoring插件(monitoring)使用JavaMelody,对Jenkins进行监控.插件 ...
- 测试工具_webbench
目录 一.简介 二.例子 一.简介 Webbench是知名的网站压力测试工具,能测试处在相同硬件上,不同服务的性能以及不同硬件上同一个服务的运行状况. webbench的标准测试可以向我们展示服务器的 ...
- C语言程序与设计:统计素数并求和
目录 C语言程序与设计:统计素数并求和 1.题目要求 2.分析 3.代码 C语言程序与设计:统计素数并求和 1.题目要求 输入两个正整数 m 和 n(1≤m≤n≤500),统计给定整数 m 和 n 区 ...
- java 编程基础 Class对象 反射 :获取类的构造方法,方法,成员变量,内部类,外部类,父类,实现的接口,修饰符等...
类 Class 每个类被加载之后,系统就会为该类生成一个对应的Class对象,通过该Class对象就可以访问到JVM中的这个类. 我们在Java中获取Class对象一般有三种方式: (1), 使用C ...
- ligerUI问题
1.checkboxColWidth:990,Grid的复选框的宽度设置为什么不起作用. 2.当grid出现横线不对齐时,可以设置detailColWidth:90,属性进行设置.此属性好像只是针对复 ...
- 【LeetCode】107. Binary Tree Level Order Traversal II 解题报告 (Python&C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:DFS 方法二:迭代 日期 [LeetCode ...
- 【LeetCode】1007. Minimum Domino Rotations For Equal Row 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 遍历一遍 日期 题目地址:https://leetc ...
- 【LeetCode】720. Longest Word in Dictionary 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力查找 排序 日期 题目地址:https://le ...