Java设计模式之工厂模式案例详解
作者:温故知新之java 时间:2023-11-27 20:08:03
分类
1.简单工厂模式
2.工厂方法模式
3.抽象工厂模式
案例
需求
根据蛋糕的不同口味,分别创建苹果味和香蕉味的蛋糕实例
方案一:简单工厂模式
定义蛋糕父类
/**
* 蛋糕
* @author:liyajie
* @createTime:2022/2/14 10:17
* @version:1.0
*/
public class Cake {
}
定义苹果味的蛋糕
/**
* 苹果蛋糕
* @author:liyajie
* @createTime:2022/2/14 10:17
* @version:1.0
*/
public class AppleCake extends Cake{
public AppleCake(){
System.out.println("创建了苹果蛋糕实例");
}
}
定义香蕉味的蛋糕
/**
* 香蕉蛋糕
* @author:liyajie
* @createTime:2022/2/14 10:17
* @version:1.0
*/
public class BananaCake extends Cake{
public BananaCake(){
System.out.println("创建了香蕉蛋糕实例");
}
}
定义蛋糕工厂类
/**
* 蛋糕工厂
* @author:liyajie
* @createTime:2022/2/14 10:16
* @version:1.0
*/
public class CakeFactory {
public Cake createCake(String type){
if("apple".equals(type)){
return new AppleCake();
}else if("banana".equals(type)){
return new BananaCake();
}else {
return null;
}
}
}
定义测试类
/**
* 测试类
* @author:liyajie
* @createTime:2022/2/14 10:25
* @version:1.0
*/
public class Test {
public static void main(String[] args) {
CakeFactory cakeFactory = new CakeFactory();
cakeFactory.createCake("apple");
cakeFactory.createCake("banana");
}
}
查看结果:
方案二:工厂方法模式
定义蛋糕父类
/**
* 蛋糕父类
* @author:liyajie
* @createTime:2022/2/14 10:44
* @version:1.0
*/
public abstract class Cake {
}
定义苹果蛋糕
/**
* 苹果蛋糕
* @author:liyajie
* @createTime:2022/2/14 10:17
* @version:1.0
*/
public class AppleCake extends Cake {
public AppleCake(){
System.out.println("创建了苹果蛋糕实例");
}
}
定义香蕉蛋糕
/**
* 香蕉蛋糕
* @author:liyajie
* @createTime:2022/2/14 10:17
* @version:1.0
*/
public class BananaCake extends Cake {
public BananaCake(){
System.out.println("创建了香蕉蛋糕实例");
}
}
定义蛋糕工厂类 该类主要是定义了createCake抽象方法,并且在无参构造函数中进行调用,具体的实现是在子类里进行实例化的
/**
* 蛋糕工厂类
* @author:liyajie
* @createTime:2022/2/14 11:55
* @version:1.0
*/
public abstract class CakeFactory {
abstract Cake createCake();
public CakeFactory() {
createCake();
}
}
定义苹果蛋糕工具类
/**
* @desc:
* @author:liyajie
* @createTime:2022/2/14 11:58
* @version:1.0
*/
public class AppleCakeFactory extends CakeFactory{
@Override
public Cake createCake() {
return new AppleCake();
}
}
定义香蕉蛋糕工具类
/**
* @desc:
* @author:liyajie
* @createTime:2022/2/14 11:58
* @version:1.0
*/
public class BananaCakeFactory extends CakeFactory{
@Override
public Cake createCake() {
return new BananaCake();
}
}
定义测试类
/**
* 测试类
* @author:liyajie
* @createTime:2022/2/14 12:02
* @version:1.0
*/
public class Test {
public static void main(String[] args) {
AppleCakeFactory appleCakeFactory = new AppleCakeFactory();
BananaCakeFactory bananaCakeFactory = new BananaCakeFactory();
}
}
查看结果
方案三:抽象工厂模式
定义蛋糕父类
/**
* @desc:
* @author:liyajie
* @createTime:2022/2/14 10:44
* @version:1.0
*/
public abstract class Cake {
}
定义苹果蛋糕
/**
* 苹果蛋糕
* @author:liyajie
* @createTime:2022/2/14 10:17
* @version:1.0
*/
public class AppleCake extends Cake {
public AppleCake(){
System.out.println("创建了苹果蛋糕实例");
}
}
定义香蕉蛋糕
/**
* 香蕉蛋糕
* @author:liyajie
* @createTime:2022/2/14 10:17
* @version:1.0
*/
public class BananaCake extends Cake {
public BananaCake(){
System.out.println("创建了香蕉蛋糕实例");
}
}
定义蛋糕工厂类
/**
* @desc:
* @author:liyajie
* @createTime:2022/2/14 11:55
* @version:1.0
*/
public interface CakeFactory {
Cake createCake();
}
定义苹果蛋糕工厂类
/**
* @desc:
* @author:liyajie
* @createTime:2022/2/14 11:58
* @version:1.0
*/
public class AppleCakeFactory implements CakeFactory {
@Override
public Cake createCake() {
return new AppleCake();
}
}
定义香蕉蛋糕工厂类
/**
* @desc:
* @author:liyajie
* @createTime:2022/2/14 11:58
* @version:1.0
*/
public class BananaCakeFactory implements CakeFactory {
@Override
public Cake createCake() {
return new BananaCake();
}
}
定义蛋糕工厂生成器
/**
* @desc:
* @author:liyajie
* @createTime:2022/2/14 17:46
* @version:1.0
*/
public class FactoryProducter {
CakeFactory cakeFactory;
public FactoryProducter(CakeFactory cakeFactory){
setCakeFactory(cakeFactory);
}
public void setCakeFactory(CakeFactory cakeFactory){
this.cakeFactory = cakeFactory;
cakeFactory.createCake();
}
}
定义测试类
/**
* 测试类
* @author:liyajie
* @createTime:2022/2/14 12:02
* @version:1.0
*/
public class Test {
public static void main(String[] args) {
new FactoryProducter(new AppleCakeFactory());
new FactoryProducter(new BananaCakeFactory());
}
}
查看结果
对比分析
方案一:简单工厂模式,工厂类是只有一个,只需要改动这一个地方 避免了业务逻辑的代码和创建对象的代码大量耦合,降低耦合 让代码更加条理清晰,更加优雅
方案二:工厂方法模式是简单工厂模式的衍生,定义一个创建对象的抽象方法,由子类决定要实例化的类,将对象实例化延迟到子类,实现了可扩展,层次结构更复杂,可以应用到更复杂的场合
方案三:抽象工厂模式,定义一个接口来用于创建相关的或者具有依赖关系的对象簇,将实例化对象的细节提取出来,放到工厂角色,由工厂角色负责具体的创建细节,解耦合,提高项目可扩展性和可维护性
来源:https://juejin.cn/post/7064506001608671246
标签:Java,设计模式,工厂模式
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
android中ListView数据刷新时的同步方法
2022-02-01 16:34:45
Maven学习----Maven安装与环境变量配置教程
2021-12-04 08:20:25
![](https://img.aspxhome.com/file/2023/8/60678_0s.png)
Spring中实现定时调度的几种方法
2021-08-29 13:04:44
Spring Boot中如何使用Swagger详解
2023-09-27 18:13:58
![](https://img.aspxhome.com/file/2023/9/91079_0s.png)
C#中的Linq Intersect与Except方法使用实例
2021-11-30 01:25:52
![](https://img.aspxhome.com/file/2023/7/69787_0s.png)
Java迭代器与Collection接口超详细讲解
2022-07-14 05:10:49
![](https://img.aspxhome.com/file/2023/9/66069_0s.png)
c#异步操作async await状态机的总结(推荐)
2021-08-22 07:13:12
![](https://img.aspxhome.com/file/2023/7/129687_0s.png)
C#判断当前程序是否通过管理员运行的方法
2023-09-27 15:48:24
C# 类的声明详解
2022-10-15 14:08:38
详解Java中的迭代迭代器Iterator与枚举器Enumeration
2021-08-21 19:32:44
SpringMVC 域对象共享数据的实现示例
2021-07-18 15:45:57
![](https://img.aspxhome.com/file/2023/6/75016_0s.png)
Android 中使用RadioGroup和Fragment实现底部导航栏的功能
2022-07-17 16:11:04
![](https://img.aspxhome.com/file/2023/3/106013_0s.gif)
MyBatis入门实例教程之创建一个简单的程序
2022-04-26 14:38:14
![](https://img.aspxhome.com/file/2023/0/129280_0s.png)
Java实现字符串解析为日期时间的方法示例
2021-10-29 17:43:34
![](https://img.aspxhome.com/file/2023/8/91148_0s.jpg)
9个非常棒的Android代码编辑器 移动开发者的最爱
2021-11-08 07:04:06
![](https://img.aspxhome.com/file/2023/9/137669_0s.jpg)
shiro无状态web集成的示例代码
2021-10-13 06:15:46
Unity 百度AI实现Logo商标识别
2023-06-09 17:04:26
![](https://img.aspxhome.com/file/2023/5/84465_0s.jpg)
详解Java虚拟机管理的内存运行时数据区域
2023-12-04 01:32:35
![](https://img.aspxhome.com/file/2023/4/81334_0s.png)
Android webveiw 出现栈错误解决办法
2023-11-29 01:54:26
Android控件CardView实现卡片布局
2022-12-05 02:10:32
![](https://img.aspxhome.com/file/2023/7/96027_0s.jpg)