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


猜你喜欢
- Windows10 上的JDK安装配置1、前往 JDK 官网下载对应 jdk 版本安装包:下载地址本文以 jdk-8u161-windows
- 原由移动开发中,随着项目不断的跌代,需求越来越复杂后。项目工程也越来越庞大。那么此时的分module的开发,则是必然的选择了。在最终的组件化
- 前言从 Java 5.0 开始,String 类新增了一个强大的字符串格式化方法 format()。这个方法到现在用的人还是不多,实在是一种
- 创建类模式主要关注对象的创建过程,将对象的创建过程进行封装,使客户端可以直接得到对象,而不用去关心如何创建对象。创建类模式有5种,分别是:
- 数学工具类Math,供大家参考,具体内容如下1. 概述java.util.Math类是数学相关的工具类,里面提供了大量的静态方法,完成与数学
- 前言${} 和 #{} 都是 MyBatis 中用来替换参数的,它们都可以将用户传递过来的参数,替换到 MyBatis 最终生成的
- 前言Java中的原生反射库虽然方法不多,但写起来却非常繁琐, 比如:public static <T> T create(Htt
- 本文实例为大家分享了Android仿IOS UIAlertView对话框的具体代码,供大家参考,具体内容如下显示效果:我在参考链接中看到了作
- 项目要用到弹出框,还要和苹果的样式一样(Android真是没地位),所以就自己定义了一个,不是很像(主要是没图),但是也还可以。废话不多说了
- 本文实例讲述了android自由改变Dialog窗口位置的方法。分享给大家供大家参考。具体如下:Dialog dialog = new Di
- 我在5月份的时候就申请了洞态IAST企业版内测,算是比较早的一批用户了。聊聊几个我比较在意的问题,比如API接口覆盖率、第三方开源组件检测以
- 本文实例讲述了Android编程设计模式之中介者模式。分享给大家供大家参考,具体如下:一、介绍中介者模式(Mediator Pattern)
- 前言 在微信刚流行的时候,在摇一摇还能用来那啥的时候,我也曾深更半夜的拿着手机晃一晃。当时想的最多的就是
- 如果只想查看注解,请跳到文章末尾部分简介在前后端进行数据交互中,在前端把数据传送到后端前,一般会先进行校验一次,校验成功之后,才把数据发送到
- 概览1. 基于链表的可选有界阻塞队列。根据FIFO的出入队顺序,从队列头部检索和获取元素,在队列尾部插入新元素。2. 当作为有界阻塞队列,在
- 一、前言前面我们介绍了运算符的一部分运算符,现在我们把剩余的他介绍完全来二、运算符赋值运算符所谓赋值,就是一个等于号连接的两个如int a=
- clone() 方法麻烦一些,需要将所有涉及到的类实现声明式接口 Cloneable,并覆盖Object类中的clone()方法,并设置作用
- 在上一篇文章:Flutter进阶—实现动画效果(二)的最后,我们实现了一个控件,其中包含各种布局和状态处理控件。以及使用自定义的动画感知绘图
- 本文实例为大家分享了C#实现套接字发送接收数据的具体代码,供大家参考,具体内容如下服务端namespace TestServer{ &nbs
- java list,set,map,数组间的相互转换详解1.list转setSet set = new HashSet( new Array