工厂方法模式-java实现

news2024/12/24 8:22:29

介绍

工厂方法模式,通过把工厂抽象为一个接口,这样当我们新增具体产品的时候,就只需要实现一个新的具体工厂类即可。一个具体工厂类,对应着一个产品。

请注意:在工厂方法模式中,一个具体工厂类只对应生产一个产品。(这是扩展产品的关键)

工厂方法模式与简单工厂模式的区别就是,不直接使用具体的工厂类,而是使用一个共同的工厂接口,于是把创建产品的任务延迟到子类进行,这样做的好处是,当我们需要增加新产品时,不需要直接去工厂类修改代码,只需新增一个工厂子类即可。

程序员只需要关注去使用哪一个具体工厂类即可。

演示一个例子:

假设现在只有一个产品table,我们希望再添加一个产品chair

那我们可以画出以下的uml图

 

我们还有一个客户端需要耦合与工厂对象,那么,我们其实也可以将客户端变成与配置文件的弱耦合,通过配置文件来决定去创建哪个工厂类

创建产品接口

public interface Product {
    //返回产品的信息
    String getDate();
}

创建具体产品

public class Table implements Product{
    private String name;

    public Table(String name) {
        this.name = name;
    }

    @Override
    public String getDate() {
        return "产品信息:"+name;
    }
}
public class Chair implements Product{
    private String name;

    public Chair(String name) {
        this.name = name;
    }

    @Override
    public String getDate() {
        return "产品信息:"+name;
    }
}

创建工厂接口

public interface Factory {
    //生产产品
    Product create();
}

创建工厂的具体实现类:

TableFactory,ChairFactory

public class TableFactory implements Factory{
    @Override
    public Product create() {
        return new Table("桌子");
    }
}
public class ChairFactory implements Factory{
    @Override
    public Product create() {
        return new Chair("椅子");
    }
}

创建测试的客户端

我们用客户端中的步骤来模拟上面的场景

public class Client {
    public static void main(String[] args) {
        //创建工厂类
        Factory factoryA=new TableFactory();
        //使用工厂类创建产品
        Product tableProduct = factoryA.create();
        //第一个产品的信息
        System.out.println(tableProduct.getDate());

        //新增了产品chair以后,创建该产品
        Factory factoryB=new ChairFactory();
        Product chairProduct = factoryB.create();
        System.out.println(chairProduct.getDate());
    }
}

运行结果:

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3+vite配置多入口文件

1.修改vite.config.ts 文件: 2.在src目录底下建相应的html文件和对应的ts入口文件和vue文件,如下图: npm run dev运行后本地访问: http://127.0.0.1:5173/home_index.htmlnpm run build打包后的结构如图:

物联网的定义、原理、示例、未来

什么是物联网? 物联网 (IoT) 是指由嵌入传感器、软件和网络连接的物理设备、车辆、电器和其他物理对象组成的网络,允许它们收集和共享数据。这些设备(也称为“智能对象”)的范围可以从简单的“智能家居”设备(如智能恒温器)到可穿戴设备(如智能手表和支持RFID的服…

Anaconda Prompt使用pip安装PyQt5-tools后无法打开Spyder或闪退

艹!MLGBZD! 真TMD折腾人! 出现原因: 首次安装完Anaconda3-2023.07-1-Windows-x86_64.exe后首次打开Spyder,此时是没有问题的,然后打开Anaconda Prompt,查看有哪些包,pip list 这时候开始首次安…

k8s之Pod控制器

目录 一、Pod控制器及其功用二、pod控制器的多种类型2.1 pod容器中的有状态和无状态的区别 三、Deployment 控制器四、SatefulSet 控制器4.1 StatefulSet由以下几个部分组成4.2 为什么要有headless?4.3 为什么要有volumeClaimTemplate?4.4 滚动更新4.5 扩…

Rocketmq Filter 消息过滤(TAGS、SQL92)原理详解 源码解析

1. 背景 1.1 Rocketmq 支持的过滤方式 Rocketmq 作为金融级的业务消息中间件,拥有强大的消息过滤能力。其支持多种消息过滤方式: 表达式过滤:通过设置过滤表达式的方式进行过滤 TAG:根据消息的 tag 进行过滤。SQL92&#xff1a…

【每日一题】—— B. Maximum Rounding(Codeforces Round 891 (Div. 3))

🌏博客主页:PH_modest的博客主页 🚩当前专栏:每日一题 💌其他专栏: 🔴 每日反刍 🟡 C跬步积累 🟢 C语言跬步积累 🌈座右铭:广积粮,缓称…

UNIX网络编程——UDP协议,CS架构

目录 一.socket创建通信的套接字 二.IPv4地址结构 三.通用地址结构 四. 两种地址结构的使用场合 五.sendto发送数据 六.bind固定地址信息​编辑 七.recvfrom接受UDP的消息​编辑 一.socket创建通信的套接字 二.IPv4地址结构 三.通用地址结构 四. 两种地址结构的使用场合…

MySQL— 基础语法大全及操作演示!!

MySQL—— 基础 一、MySQL概述1.1 、数据库相关概念1.2 、MySQL 客户端连接1.3 、数据模型 二、SQL2.1、SQL通用语法2.2、SQL分类2.3、DDL2.4、DML2.5、DQL2.6、DCL 三、函数四、约束五、多表查询六、事务 一、MySQL概述 1.1 、数据库相关概念 数据库、数据库管理系统、SQL&a…

sql server 删除指定字符串

replace方法 update #test set FIVCODEreplace(FIVCODE,440,) WHERE SOURCEFENTRYID140728

嵌入式软件测试-测试类型

使用质量属性来定义测试类型,即回归到测试类型的本质。 如果测试负载在系统允许的负载范围内,那测试的是系统的功能,此时的测试属于功能性测试;若在此基础上再加大测试时间,那就是稳定性测试了,此时关注的…

有哪些常用的设计素材网站?

素材网站可以是设计师和创意人员的灵感来源。这些网站收集了各种类型的平面设计图片,包括标志、海报、网站设计、包装设计、插图等。在本文中,我将推荐15个平面设计图素材网站,以帮助您找到新的想法和灵感。 1.即时设计资源社区 即时设计资…

8月8日上课内容 研究nginx组件rewrite

location 匹配uri location 匹配的规则和优先级。(重点,面试会问,必须理解和掌握) nginx常用的变量,这个要求掌握 rewrite:重定向功能。有需要掌握,有需要理解的。 location匹配:…

【RabbitMQ】golang客户端教程5——使用topic交换器

topic交换器(主题交换器) 发送到topic交换器的消息不能具有随意的routing_key——它必须是单词列表,以点分隔。这些词可以是任何东西,但通常它们指定与消息相关的某些功能。一些有效的routing_key示例:“stock.usd.ny…

角角の Qt学习笔记(一)

目录 一、解决在创建新项目时遇到的几个问题 二、信号和槽(非自定义) 三、调用 UI 中的元素(比如按钮) 一、解决在创建新项目时遇到的几个问题 在新建项目时,我选择的构建系统为CMake。然后勾选了Generate form&…

程序员月薪3w、4w难吗?该如何突破?

先说结论,如果你能成为互联网大厂的程序员,那么恭喜你,你的月薪大概率能达到3w、4w,甚至更高,此外一些非互联网大厂的程序员,比如金融、汽车制造等,月薪突破3w、4w的概率也非常高,但…

分享一个计算器

先看效果&#xff1a; 再看代码&#xff08;查看更多&#xff09;&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>计算器</title><style>* {box-sizing: border-box;}body…

threejs点击模型实现模型边缘高亮的选中效果--更改后提高帧率

先来个效果图 之前写的那个稍微有点问题&#xff0c;帧率只有30&#xff0c;参照官方代码修改后&#xff0c;帧率可以达到50了&#xff0c;在不全屏的状态下&#xff0c;帧率60 1.首先需要导入库 // 用于模型边缘高亮 import { EffectComposer } from "three/examples/js…

React Native 样式布局基础知识

通过此篇笔记能够学习到如下的几个知识点 在 React Native 中使用样式的一些细节了解 React Native 的 Flex 布局概念了解 React Native 的 flex 布局属性React Native 如何添加多样式属性React Native 中绝对布局和相对布局 React Native 中的 Flex 布局概念 1、主轴和交叉…

06-1_Qt 5.9 C++开发指南_对话框与多窗体设计_标准对话框

在一个完整的应用程序设计中&#xff0c;不可避免地会涉及多个窗体、对话框的设计和调用&#xff0c;如何设计和调用这些对话框和窗体是搞清楚一个庞大的应用程序设计的基础。本章将介绍对话框和多窗体设计、调用方式、数据传递等问题&#xff0c;主要包括以下几点。 Qt 提供的…

JavaWeb 速通Cookie

目录 一、关于base标签 1.引入 : 2.介绍 : 3.实例 : 4.细节 : 二、Cookie的引入 1.会话技术 : 1 什么是会话技术&#xff1f; 2 会话技术用于解决什么问题&#xff1f; 2.Cookie介绍 1 Cookie有什么用&#xff1f; 2 Cookie通讯机制 三、Cookie的基本使用 1.创建Cookie…