工厂方法模式介绍

韩敬海 设计模式(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{


    @Override
    public 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{
    @Override
    public 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{
    @Override
    public 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 {


    @Override
    public 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 {

    @Test
    public 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)解耦:高层模块只需要知道产品的抽象类,不需要关注产品的实现类,符合迪米特法则、依赖倒置原则、里氏替换原则。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/89712.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android Studio实现解析HTML获取json,解析json图片URL,将URL存到list,进行瀑布流展示

目录 效果build.gradle(app)添加的依赖(用不上的可以不加)AndroidManifest.xml错误activity_main.xmlitem_image.xmlMainActivityImage适配器ImageModel 接收图片URL 效果 build.gradle(app)添加的依赖&…

win10 maven 安装环境变量设置不成功

maven 按照正常步骤设置环境变量 输入命令总是不能正常现实mvn的版本 解决方案: 1.删除掉设置的用户环境变量 2.将maven的完整目录写入系统变量path中 3.将该路径放到所有变量的最前面 4.点击确定,重新打开cmd 输入 mvn -v 正常了

Java——一个Java实体类,表示一个试题的模型

这段代码是一个Java实体类,表示一个试题的模型。 该实体类具有以下属性: id:题号,表示试题的编号。title:题目,表示试题的题目内容。optionA:选项A,表示试题的选项A。optionB&#…

如何通过tomcat下载映射下载文件

1.1找到tomcat服务器中server.xml文件 !--doBase是静态资源路径位置&#xff0c; path作用相当于设置的key, doBase作用相当于value --> <Context path"/download" docBase"E:\testBackData"></Context>1.2 找到tomcat服务器中web.xml文…

JAVA JNA 调用C接口的三种方式

文章目录 1. 准备一个共享库文件2. JNA姿势1—继承Library接口3. JNA姿势2—直接NativeLibrary.getInstance3. JNA姿势3—Native方法 1. 准备一个共享库文件 test.c #include <stdio.h> int test(char *input){printf("input:%s\n",input);return 0; }libtes…

Wlan安全——认证与加密方式(WPA/WPA2)

目录 终端认证技术 WEP认证 PSK认证 802.1x认证与MAC认证 Portal认证 数据加密技术 WEP加密 TKIP加密 CCMP加密 TKIP和CCMP生成密钥所需要的密钥信息 802.11安全标准 WEP共享密钥认证、加密工作原理 WEP共享密钥认证 WEP加解密过程 PSK认证以及生成动态密钥的工…

共创无线物联网数字化新模式|协创数据×企企通采购与供应链管理平台项目成功上线

近日&#xff0c;全球无线物联网领先者『协创数据技术股份有限公司』&#xff08;以下简称“协创数据”&#xff09;SRM采购与供应链项目全面上线&#xff0c;并于近日与企企通召开成功召开项目上线总结会。 基于双方资源和优势&#xff0c;共同打造了物联网特色的数字化采购供…

【C++】iota函数 + sort函数实现基于一个数组的多数组对应下标绑定排序

目录 一、iota函数 1. 函数解析 ​① 迭代器类型(补充) ② 头文件 ③ 参数 2. 函数用途与实例 二、sort函数 1、 函数解读 2、实现倒序排列 2.1 greater 与 less 模板参数 2.2 lambda表达式 三、下标绑定排序&#xff08;zip&#xff09; --- 833.字符串中的查找与替换 一、…

27- v-model 原理 组件应用

v-model 原理 原理: V-model本质上是一个语法糖。例如应用在输入框上&#xff0c;就是 value属性 和 input事件 的合写 作用: 提供数据的双向绑定 (1) 数据变,视图跟着变 : value (2) 试图变,数据跟着变: input 注意: $event 用于在模板中, 获取事件的形参 <template>…

RabbitMQ---基本消息模型

1、 基本消息模型 官方介绍&#xff1a; RabbitMQ是一个消息代理&#xff1a;它接受和转发消息。 你可以把它想象成一个邮局&#xff1a;当你把邮件放在邮箱里时&#xff0c;你可以确定邮差先生最终会把邮件发送给你的收件人。 在这个比喻中&#xff0c;RabbitMQ是邮政信箱&a…

无涯教程-PHP - Session选项

从PHP7 起&#xff0c; session_start()()函数接受一系列选项&#xff0c;以覆盖在 php.ini 中设置的会话配置指令。这些选项支持 session.lazy_write &#xff0c;默认情况下此函数为on&#xff0c;如果会话数据已更改&#xff0c;则会导致PHP覆盖任何会话文件。 添加的另一个…

【在Windows下搭建Tomcat HTTP服务】

文章目录 前言1.本地Tomcat网页搭建1.1 Tomcat安装1.2 配置环境变量1.3 环境配置1.4 Tomcat运行测试1.5 Cpolar安装和注册 2.本地网页发布2.1.Cpolar云端设置2.2 Cpolar本地设置 3.公网访问测试4.结语 前言 Tomcat作为一个轻量级的服务器&#xff0c;不仅名字很有趣&#xff0…

Java并发工具类

JDK并发包中常用并发工具类&#xff1a; CountDownLatch、CyclicBarrier和Semaphore工具类提供了一种并发流程控制的手段&#xff1b; Exchanger工具类则提供了在线程间交换数据的一种手段。 等待多线程完成的CountDownLatch CountDownLatch允许一个或多个线程等待其他线程完成…

爬虫异常处理:异常捕获与容错机制设计

作为一名专业的爬虫程序员&#xff0c;每天使用爬虫IP面对各种异常情况是我们每天都会遇到的事情。 在爬取数据的过程中&#xff0c;我们经常会遇到网络错误、页面结构变化、被反爬虫机制拦截等问题。在这篇文章中&#xff0c;我将和大家分享一些关于如何处理爬虫异常情况的经…

创建和分析二维桁架和梁结构研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Jsp 解决out.print()输出多出空行

一、原因 在 JSP 中&#xff0c;HTML 标签和 JSP 指令之外的内容会被当作文本处理&#xff0c;包括空行、空格和制表符等。当 JSP 引擎解析 JSP 页面时&#xff0c;会将这些文本内容原封不动地输出到响应中。 http响应 二、解决方法 在Jsp页面最前端添加 <% page trimDir…

【Linux】动态库和静态库

动态库和静态库 软链接硬链接硬链接要注意 自定义实现一个静态库(.a)解决、使用方法静态库的内部加载过程 自定义实现一个动态库&#xff08;.so&#xff09;动态库加载过程 静态库和动态库的特点 软链接 命令:ln -s 源文件名 目标文件名 软链接是独立连接文件的&#xff0c;他…

【Winform学习笔记(八)】通过委托实现跨窗体传值

通过委托实现跨窗体传值 前言正文1、委托及事件2、通过委托实现跨窗体传值的步骤1.在子窗体中定义委托2.在子窗体中声明一个委托类型的事件3.调用委托类型事件4.在实例化子窗体后&#xff0c;子窗体订阅事件接受方法5.实现具体的事件 3、具体示例4、完整代码5、实现效果 前言 …

论文阅读_条件控制_ControlNet

name_en: Adding Conditional Control to Text-to-Image Diffusion Models name_ch: 向文本到图像的扩散模型添加条件控制 paper_addr: http://arxiv.org/abs/2302.05543 date_read: 2023-08-17 date_publish: 2023-02-10 tags: [‘图形图像’,‘大模型’,‘多模态’] author: …

解决政务审计大数据传输难题!镭速传输为政务行业提供解决方案

政务行业是国家治理的重要组成部分&#xff0c;涉及到国家安全、社会稳定、民生福祉等方面。随着信息技术的快速发展和革新&#xff0c;政务信息化也迎来了新一轮的升级浪潮。国家相继出台了《国家信息化发展战略纲要》《“十三五”国家信息化规划》《“十四五”推进国家政务信…