Java设计模式之工厂模式案例详解
作者:温故知新之java 发布时间:2023-11-27 20:08:03
标签:Java,设计模式,工厂模式
分类
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
0
投稿
猜你喜欢
- 1、修改maven的pom文件只需要将如下依赖添加到pom.xml文件中即可。(注意此处是以plugin的方式,放在<plugins&
- Springboot 实体类生成数据库表JPA:springboot -jpa:数据库的一系列的定义数据持久化的标准的体系学习的目的是:利用
- 介绍什么是ThreadLocal?ThreadLocal叫做线程变量,用于在多线程环境下创建线程本地变量。通俗的讲,ThreadLocal可
- 目录栈溢出(虚拟机栈和本地方法栈)产生原因解决思路堆溢出产生原因解决思路方法区和运行时常量池溢出产生原因解决思路本机直接内存溢出产生原因解决
- 这个例子需要使用google的开源项目zxing的核心jar包core-3.2.0.jar可以百度搜索下载jar文件,也可使用maven添加
- BitArray的基础可以看菜鸟编程BitArray 类管理一个紧凑型的位值数组,它使用布尔值来表示,其中 true 表示位是开启的(1),
- 网络中数据传输经常是xml或者json,现在做的一个项目之前调其他系统接口都是返回的xml格式,刚刚遇到一个返回json格式数据的接口,通过
- java 实现MD5加密算法的简单实例实现代码:import java.security.NoSuchAlgorithmException;
- java 闰年判断前言:给定一个年份,判断这一年是不是闰年。当以下情况之一满足时,这一年是闰年:1. 年份是4的倍数而不是100的倍数;2.
- 起因:有后端同事反馈在异步线程中获取了request中的参数,然后下一个请求是get请求的话,发现会偶尔出现参数丢失的问题.示例代码:@Ge
- MultiFrameImageStreamCompleterMultiFrameImageStreamCompleter 是一个可组合的 I
- 一、缩略图在浏览相册的时候,可能需要生成相应的缩略图。直接上代码:public class ImageUtil { private Logg
- 一. 为什么要使用接口假如有一个需求:要求实现防盗门的功能。门有"开"和"关"的功能,锁有"
- 最近项目中需要实现定时执行任务,比如定时计算会员的积分、调用第三方接口等,由于项目采用spring框架,所以这里结合spring框架来介绍。
- 本文实例讲述了Spring实战之SpEl语法。分享给大家供大家参考,具体如下:一 Beanpackage org.crazyit.app.d
- 在android开发中,有时候我们想获取手机的一些硬件信息,比如android手机的总内存和可用内存大小。这个该如何实现呢?通过读取文件&q
- 前言 短时间提升自己最快的手段就是背面试题,最近总结了Java常用的面试题,分享给大家,希望大家都能圆梦大厂,加油,我命由我不由天
- 在模板文件的表达式中,可以使用“${T(全限定类名).方法名(参数)}”这种格式来调用Java类的静态方法。开发环境:IntelliJ ID
- 导入redis的jar包<!-- redis --> <dependency>  
- 1. 前言老板说,明天甲方要来看产品,你得造点数据,而且数据必须是“真”的,演示效果要好看一些,这样他才会买我们的产品,我好明年给你换个嫂子