工厂方法模式介绍

news/2024/11/18 2:48:08/

韩敬海 设计模式(Java版)

(一)定义

定义一个创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。
工厂方法涉及的角色有:
1 .抽象工厂角色:工厂方法模式的核心,与应用系统无关,任何创建对象的工厂类必须实现这个接口。
2. 具体工厂角色:实现了抽象工厂接口,被应用程序调用以创建产品对象。
3. 抽象产品角色:定义产品的共性,实现对产品抽象的定义。
4. 具体产品角色:实现抽象产品角色所声明的接口。

(二)类图

在这里插入图片描述

(二)代码实现

1. 抽象工厂角色

package com.xiaobai.design_pattern.factorymethod.createrole;import com.xiaobai.design_pattern.factorymethod.productrole.Cake;/*** @author wangtw* @ClassName Creator* @description: 抽象工厂角色* @date 2023/8/622:10*/
public interface Creator {Cake factory();
}

2. 抽象产品角色

package com.xiaobai.design_pattern.factorymethod.productrole;/*** @author wangtw* @ClassName Product* @description: 抽象产品角色* @date 2023/8/622:16*/
public interface Cake {/*** 获取蛋糕类型*/void make();
}

3. 具体工厂角色

(1)苹果蛋糕生成工厂
package com.xiaobai.design_pattern.factorymethod.createrole;import com.xiaobai.design_pattern.factorymethod.productrole.AppleCake;
import com.xiaobai.design_pattern.factorymethod.productrole.Cake;/*** @author wangtw* @ClassName AppleCakeCrator* @description: 苹果蛋糕生成工厂(具体工厂角色)* @date 2023/8/708:23*/
public class AppleCakeCreator implements Creator{@Overridepublic Cake factory() {return new AppleCake();}
}
(2)草莓蛋糕生成工厂
package com.xiaobai.design_pattern.factorymethod.createrole;import com.xiaobai.design_pattern.factorymethod.productrole.Cake;
import com.xiaobai.design_pattern.factorymethod.productrole.StrawberryCake;/*** @author wangtw* @ClassName StrawberryCakeCrator* @description: 草莓蛋糕生成工厂(具体工厂角色)* @date 2023/8/708:24*/
public class StrawberryCakeCreator implements Creator{@Overridepublic Cake factory() {return new StrawberryCake();}
}

4. 具体产品角色

(1)苹果蛋糕
package com.xiaobai.design_pattern.factorymethod.productrole;import lombok.extern.slf4j.Slf4j;/*** @author wangtw* @ClassName AppleCake* @description: 苹果蛋糕(具体产品角色)* @date 2023/8/707:56*/
@Slf4j
public class AppleCake implements Cake{@Overridepublic void make() {    log.info("正在制作苹果蛋糕");}
}
(2)草莓蛋糕
package com.xiaobai.design_pattern.factorymethod.productrole;import lombok.extern.slf4j.Slf4j;/*** @author wangtw* @ClassName StrawberryCakeProduct* @description: 草莓蛋糕(具体产品角色)* @date 2023/8/622:34*/
@Slf4j
public class StrawberryCake implements Cake {@Overridepublic void make() {log.info("正在制作草莓蛋糕");}
}

5. 测试

package com.xiaobai.design_pattern.factorymethod;import com.xiaobai.design_pattern.factorymethod.createrole.AppleCakeCreator;
import com.xiaobai.design_pattern.factorymethod.createrole.Creator;
import com.xiaobai.design_pattern.factorymethod.createrole.StrawberryCakeCreator;
import com.xiaobai.design_pattern.factorymethod.productrole.AppleCake;
import com.xiaobai.design_pattern.factorymethod.productrole.Cake;
import org.junit.jupiter.api.Test;/*** @author wangtw* @ClassName FactoryMethodTest* @description: 工厂方法模式测试类* @date 2023/8/622:36*/
public class FactoryMethodTest {@Testpublic void test() {// 草莓蛋糕生成Creator creator1 = new StrawberryCakeCreator();Cake strawberryCake = creator1.factory();strawberryCake.make();// 苹果蛋糕生成Creator creator2 = new AppleCakeCreator();Cake appleCake = creator2.factory();appleCake.make();}
}

输出:

22:58:45.924 [main] INFO com.xiaobai.design_pattern.factorymethod.productrole.StrawberryCake - 正在制作草莓蛋糕
22:58:45.929 [main] INFO com.xiaobai.design_pattern.factorymethod.productrole.AppleCake - 正在制作苹果蛋糕

(三)总结

1. 工厂方法模式优点

(1)提高扩展性:在增加产品类的情况下,只要适当调整具体的工厂类或扩展一个工厂类,就可以适应变化。
在这里插入图片描述

(2)调用者不需要关心产品的具体实现,只需要关注产品的接口是否发生变化,因为产品的实例化是由工厂负责的。
(3)解耦:高层模块只需要知道产品的抽象类,不需要关注产品的实现类,符合迪米特法则、依赖倒置原则、里氏替换原则。


http://www.ppmy.cn/news/1055632.html

相关文章

厦门逗客传媒:抖音本地团购怎么入驻

随着社交媒体的不断发展,短视频平台已经成为了商家推广和营销的热门渠道之一。在这其中,抖音作为全球知名的短视频平台,以其巨大的用户基数和精准的推荐算法吸引了大量商家的关注。而在抖音上,本地团购也成为了一个备受关注的领域…

RabbitMQ 消费者

RabbitMQ的消费模式分两种:推模式和拉模式,推模式采用Basic.Consume进行消费,拉模式则是调用Basic.Get进行消费。   消费者通过订阅队列从RabbitMQ中获取消息进行消费,为避免消息丢失可采用消费确认机制 消费者 拉模式拉模式的实…

ASE 基础知识

笔记: 1,颜色,贴图 2,加减乘除 3,菲涅尔、sin,float、vector、time 4,漫反射,法线,自发光,金属度,反射,AO明暗,折射&#…

高等数学:线性代数-第三章

文章目录 第3章 矩阵的初等变换与线性方程组3.1 矩阵的初等变换3.2 矩阵的秩3.3 方程组的解 第3章 矩阵的初等变换与线性方程组 3.1 矩阵的初等变换 矩阵的初等变换 下面三种变换称为矩阵的初等变换 对换两行(列),记作 r i ↔ r j ( c i …

如何使用PyQt进行网络编程?

PyQt是一个用Python编写的图形用户界面库,它能够让你创建具有图形用户界面的应用程序,比如你可以用它来创建漂亮的窗口、按钮、文本框等等。而网络编程则是让你的应用程序能够与远程服务器进行通信,比如获取网页内容、发送和接收电子邮件、访…

C#的IndexOf

在 C# 中,IndexOf 是一个字符串、数组或列表的方法,用于查找指定元素的第一个匹配项的索引。它返回一个整数值,表示匹配项在集合中的位置,如果未找到匹配项,则返回 -1。 IndexOf 方法有多个重载形式,可以根…

Linux知识点 -- Linux多线程(三)

Linux知识点 – Linux多线程(三) 文章目录 Linux知识点 -- Linux多线程(三)一、线程同步1.概念理解2.条件变量3.使用条件变量进行线程同步 二、生产者消费者模型1.概念2.基于BlockingQueue的生产者消费者模型3.单生产者单消费者模…

蓝帽杯半决赛2022

手机取证_1 iPhone手机的iBoot固件版本号:(答案参考格式:iBoot-1.1.1) 直接通过盘古石取证 打开 取证大师和火眼不知道为什么都无法提取这个 手机取证_2 该手机制作完备份UTC8的时间(非提取时间):(答案…