工厂方法模式-java实现

介绍

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

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

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

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

演示一个例子:

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

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

 

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

创建产品接口

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

创建具体产品

public class Table implements Product{private String name;public Table(String name) {this.name = name;}@Overridepublic String getDate() {return "产品信息:"+name;}
}
public class Chair implements Product{private String name;public Chair(String name) {this.name = name;}@Overridepublic String getDate() {return "产品信息:"+name;}
}

创建工厂接口

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

创建工厂的具体实现类:

TableFactory,ChairFactory

public class TableFactory implements Factory{@Overridepublic Product create() {return new Table("桌子");}
}
public class ChairFactory implements Factory{@Overridepublic 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.mzph.cn/news/28997.shtml

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

相关文章

常微分方程建模R包ecode(三)——探寻平衡点

在建立常微分方程后,我们常常会问的一个问题是: 这个常微分方程系统中是否存在平衡点?如果存在,这个平衡点是否稳定? 本节将展示如何通过ecode包来回答这个问题。 我们首先利用ecode包建立一个Lotka–Volterra竞争模型…

活动发布会邀请媒体6步走

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 邀请媒体参加活动发布会对信息的传播,企业品牌建设有诸多的好处,今天就与大家分享下邀请媒体参加活动报道的6个步骤: 1. 策划与准备: -明…

【Flutter】【packages】simple_animations 简单的实现动画

package:simple_animations 导入包到项目中去 可以实现简单的动画, 快速实现,不需要自己过多的设置 有多种样式可以实现[ ] 功能: 简单的用例:具体需要详细可以去 pub 链接地址 1. PlayAnimationBuilder PlayAnima…

java多线程及

多线程使用 在java中,多线程得主要实现方式有四种:继承Thread类,实现Runnable接口、实现callable接口通过FutureTask包装器来创建Thread线程,使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执…

勘探开发人工智能应用:人工智能概述

0 提纲 机器学习、深度学习、计算机视觉等技术已在勘探开发、油气生产、炼油炼化、经营管理等重点环节进行应用与推广。请思考: 输入:数据是什么(数字、文本、图)?如何理解数据?如何清洗数据?(需要专业领域知识)输出&…

实习碎碎念

话说实习一周多了,学到的比自学一个月都多~~~加油狗子你最棒!!! 环境搭建坑死了 SSM框架环境配置 Ideamavenjdktomcatnavicat https://www.cnblogs.com/seigann/p/14528551.htmlhttps://www.cnblogs.com/seigann/p/14528551.h…

模板初阶以及string类使用

模板初阶以及string类使用 模板的简单认识1.泛型编程2.函数模板模板的原理图函数模板格式函数模板实例化非模板函数和模板函数的匹配原则 3.类模板类模板的定义格式类模板的实例化 string1.string简介2.string常用的接口 题目练习1.字符串相加2.字符串里面最后一个单词的长度3.…

【瑞吉外卖】Git部分学习

Git简介 Git是一个分布式版本控制工具,通常用来对软件开发过程中的源代码文件进行管理。通过Git仓库来存储和管理这些文件,Git仓库分为两种: 本地仓库:开发人员自己电脑上的Git仓库 远程仓库:远程服务器上的Git仓库…

CVE漏洞复现-CVE-2021-3493 Linux 提权内核漏洞

CVE-2021-3493 Linux 提权内核漏洞 漏洞描述 CVE-2021-3493 用户漏洞是 Linux 内核中没有文件系统中的 layfs 中的 Ubuntu over 特定问题,在 Ubuntu 中正确验证有关名称空间文件系统的应用程序。buntu 内核代码允许低权限用户在使用 unshare() 函数创建的用户命名…

kubernetes configmap 的data中的文件内容格式错乱

截取一段错乱的配置: kubectl -n monitoring get cm blackbox-exporter-configuration -o yaml apiVersion: v1 data:config.yml: "\"modules\":\n \"http_2xx\":\n \"http\":\n \"preferred_ip_protocol\"…

线上电影购票选座H5小程序源码开发

搭建一个线上电影购票选座H5小程序源码需要一些基本的技术和步骤。以下是一个大致的搭建过程,可以参考: 1. 确定需求和功能:首先要明确你想要的电影购票选座H5小程序的需求和功能,例如用户登录注册、电影列表展示、选座购票、订单…

【Java可执行命令】(二十一)线程快照生成工具 jstack:帮助开发人员分析和排查线程相关问题(死锁、死循环、线程阻塞...)

Java可执行命令之jstack 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法格式3.2 使用步骤及技巧3.3 使用案例 4️⃣ 应用场景🌾 总结 1️⃣ 概念 jstack 命令是 Java Development Kit(JDK)中提供的一项诊断工具,用于生成Java虚拟…

WHQL认证中HCK和HLK的区别

开发者或硬件制造商要通过WHQL认证获得微软数字签名或是Windows徽标的使用权限,就需要使用WHQL认证的测试工具(HCK或HLK)对硬件设备或驱动程序进行测试。HCK和HLK其实是一个系列的测试工具,HCK和HLK的主要区别是用于测试不同Windo…

pytest测试框架之fixture测试夹具详解

fixture的优势 ​ pytest框架的fixture测试夹具就相当于unittest框架的setup、teardown,但相对之下它的功能更加强大和灵活。 命名方式灵活,不限于unittest的setup、teardown可以实现数据共享,多个模块跨文件共享前置后置可以实现多个模块跨…

JAVA SpringBoot 项目 多线程、线程池的使用。

1.1 线程: 线程就是进程中的单个顺序控制流,也可以理解成是一条执行路径 单线程:一个进程中包含一个顺序控制流(一条执行路径) 多线程:一个进程中包含多个顺序控制流(多条执行路径&#xff0…

前端实习周记第三周周记

第二周总结 第二周主要是做了一些PC端细节内容。大的地方改的不多,但是小的细节蛮多。 值得一提的是,第二周做的微信小程序,改了很多逻辑。改逻辑需要与后端进行联调,收获很大,思路也愈发清楚。 记录做了什么是好习…

天津农商银行智能加密锁管理工具常见问题

天津农商银行智能加密锁管理工具,在使用过程中,可能出现一些莫名的错误,针对亲身遇到的坑,分享给大家,以备不时之需。 一、转账业务导入文件中文汉字出现乱码,如下图。 原因是文件编码不正确,…

Java项目作业~ 创建基于Maven的Java项目,连接数据库,实现对站点信息的管理,即实现对站点的新增,修改,删除,查询操作

需求: 创建基于Maven的Java项目,连接数据库,实现对站点信息的管理,即实现对站点的新增,修改,删除,查询操作。 以下是站点表的建表语句: CREATE TABLE websites (id int(11) NOT N…

收钱吧与火山引擎VeDI合作一年后 有了哪些新变化?

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 收钱吧正在和火山引擎数智平台(VeDI)跑出一条业务提效新通路。 相关数据显示,收钱吧的日服务人次就近5000万,累计服务…