java设计模式(四)——抽象工厂模式

一、模式介绍

改善在工厂方法模式中,扩展时新增产品类、工厂类,导致项目中类巨多的场面,减少系统的维护成本,且一个工厂可以生成多种产品,而不是同一种的产品,比如一个工厂既可以生产鞋子又可以衣服,而不是只能生产鞋子。

二、工厂方法模式

1、实现步骤

第一步: 定义产品的抽象基类,如鞋子(Shoes.class),衣服(Clothe.class)
// 1、定义鞋 产品抽象基类
abstract class Shoes {// 展示logopublic abstract void showLogo();
}
// 1、定义衣服 产品抽象基类
abstract class Clothe {// 展示logopublic abstract void showLogo();
}
第二步:定义具体产品类,继承产品抽象基类,如飞跃牌鞋子(FeiYueShoes.class),飞跃牌衣服(FeiYueClothe.class),回力牌鞋子(HuiLiShoes.class),回力牌衣服(HuiLiClothe.class)
//2.定义具体品牌的鞋类,继承鞋抽象基类
public class FeiYueShoes extends Shoes {@Overridepublic void showLogo() {System.out.println("这是飞跃鞋");}
}
//2.定义具体品牌的衣服,继承鞋抽象基类
public class FeiYueClothe extends Clothe {@Overridepublic void showLogo() {System.out.println("这是飞跃衣服");}
}
//2.定义具体品牌的鞋类,继承鞋抽象基类
public class HuiLiShoes extends Shoes {@Overridepublic void showLogo() {System.out.println("这是回力鞋");}
}
//2.定义具体品牌的衣服,继承衣服抽象基类
public class HuiLiClothe extends Clothe {@Overridepublic void showLogo() {System.out.println("这是回力衣服");}
}
第三步:定义抽象工厂接口(AbstractFactory.class,说明工厂具体生产什么产品,鞋子,衣服,即抽象工厂生产抽象产品
//3 定义抽象工厂接口
interface AbstractFactory {// 生产鞋子Shoes produceShoes();// 生产衣服Clothe produceClothe();
}
第四步:定义生产具体产品的具体工厂类,实现抽象工厂类方法,如飞跃工厂(FeiYueFactory.class)、回力工厂(HuiLiFactory.class
// 4 定义生产飞跃产品的的具体工厂类
public class FeiYueFactory implements AbstractFactory {@Overridepublic Shoes produceShoes() {return new FeiYueShoes();}@Overridepublic Clothe produceClothe() {return new FeiYueClothe();}
}
// 4 定义生产回力产品的的具体工厂类
public class HuiLiFactory implements AbstractFactory {@Overridepublic Shoes produceShoes() {return new HuiLiShoes();}@Overridepublic Clothe produceClothe() {return new HuiLiClothe();}
}
第五步:调用抽象工厂方法(AbstractFactoryExample.class) (先实例化具体工厂类,然后调用方法生成具体产品(实例化具体产品类),最后调用产品方法、属性)
// 5 调用抽象工厂方法
public class AbstractFactoryExample {public static void main(String[] args) {//飞跃工厂FeiYueFactory feiYueFactory = new FeiYueFactory();// 生产飞跃鞋子feiYueFactory.produceShoes().showLogo();// 生产飞跃衣服feiYueFactory.produceClothe().showLogo();//回力工厂HuiLiFactory huiLiFactory = new HuiLiFactory();// 生产回力鞋子huiLiFactory.produceShoes().showLogo();// 生产回力衣服huiLiFactory.produceClothe().showLogo();}
}

2、总结

 理解抽象工厂模式的核心关键在于理解品牌家族的概念,简单工厂方法与工厂方法创建工厂的着眼于某类具体的产品,某个工厂与某个产品对应,而抽象工厂这是某个工厂与家族的产品对应,这个工厂可以生产这个品牌家族的一系列产品。如果新增品牌。则定义具体产品类,定义具体工厂类,然后调用抽象工厂方法即可。

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

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

相关文章

解决数据库PGSQL,在Mybatis中创建临时表报错TODO IDENTIFIER,连接池用的Druid。更换最新版本Druid仍然报错解决

Druid版本1.1.9报错Caused by: java.sql.SQLException: sql injection violation, syntax error: TODO IDENTIFIER : CREATE TEMPORARY TABLE temp_ball_classify (id int8 NOT NULL,create_time TIMESTAMP,create_by VARCHAR,classify_name VARCHAR) 代码如下: 测…

四川蔚澜时代电子商务有限公司打造抖音电商服务新高地

在数字化浪潮汹涌澎湃的今天,电商行业以其独特的魅力和强大的市场潜力,成为了推动经济增长的新引擎。四川蔚澜时代电子商务有限公司,作为这个领域的佼佼者,正以其专业的服务、创新的理念和卓越的实力,引领抖音电商服务…

用AI,每天创作200+优质内容,2分钟教会你操作!

前段时间发布了这篇“寻找爆款文案及标题的9大渠道,直接搬运都能搞流量!”,里面我讲到如何寻找爆款标题。最近不少朋友问我,如何创作这个标题相关的内容。 多数平台都有风控规则,有些平台内容也会有字数要求。为了让大…

SpringBoot 项目整合 MyBatis 框架,附带测试示例

文章目录 一、创建 SpringBoot 项目二、添加 MyBatis 依赖三、项目结构和数据库表结构四、项目代码1、application.yml2、TestController3、TbUser4、TbUserMapper5、TestServiceImpl6、TestService7、TestApplication8、TbUserMapper.xml9、MyBatisTest 五、浏览器测试结果六、…

JavaScript实现时钟计时

会动的时钟 1.目标 2.分析 1.最开始页面不显示时间,有两个按钮 开始 暂停。开始按钮是可以点击的,暂停按钮不能点击 2.当点击开始按钮后,设置开始按钮不可用,暂停按钮可用。然后将当前系统时间放到按钮上面。每隔1秒中更新一下…

TransMIL:基于Transformer的多实例学习

MIL是弱监督分类问题的有力工具。然而,目前的MIL方法通常基于iid假设,忽略了不同实例之间的相关性。为了解决这个问题,作者提出了一个新的框架,称为相关性MIL,并提供了收敛性的证明。基于此框架,还设计了一…

3.js - 反射率(reflectivity) 、折射率(ior)

没啥太大的感觉 反射率 reflectivity 概念 反射率:指的是,材质表面反射光线的能力反射率,用于控制材质对环境光,或光源的反射程度反射率越高,材质表面反射的光线越多,看起来就越光亮使用 适用于&#xff0…

【OCPP】ocpp1.6协议第5.1章节Cancel Reservation的介绍及翻译

目录 5.1 取消预约Cancel Reservation-概述 Cancel Reservation CancelReservation.req 请求消息 CancelReservation.conf 确认消息 取消预定的流程 应用场景 示例消息 CancelReservation.req 示例 CancelReservation.conf 示例 总结 5.1 取消预约Cancel Reservation…

VScode 常用插件

基础开发插件 Chinese (Simplified)(简体中文语言包):这是适用于VS Code的中文(简体)语言包,适用于英语不太流利的用户。Auto Rename Tag:这个插件可以同步修改HTML/XML标签,当用户修…

【PYG】Cora数据集分类任务计算损失,cross_entropy为什么不能直接替换成mse_loss

cross_entropy计算误差方式,输入向量z为[1,2,3],预测y为[1],选择数为2,计算出一大坨e的式子为3.405,再用-23.405计算得到1.405MSE计算误差方式,输入z为[1,2,3],预测向量应该是[1,0,0]&#xff0…

Dify入门指南

一.Dify介绍 生成式 AI 应用创新引擎,开源的 LLM 应用开发平台。提供从 Agent 构建到 AI workflow 编排、RAG 检索、模型管理等能力,轻松构建和运营生成式 AI 原生应用,比 LangChain 更易用。一个平台,接入全球大型语言模型。不同…

CesiumJS【Basic】- #050 绘制扫描线(Primitive方式)

文章目录 绘制扫描线(Primitive方式)- 需要自定义着色器1 目标2 代码2.1 main.ts绘制扫描线(Primitive方式)- 需要自定义着色器 1 目标 使用Primitive方式绘制扫描线 2 代码 2.1 main.ts import * as Cesium from cesium;const viewer = new Cesium.Viewer(cesiumConta…

自我反思与暑假及大三上学期规划

又要放暑假了,依稀记得上个暑假一边练车,一边试图拿捏C语言,第一次感觉暑假也可以如此忙碌。但是开学以后,我并没有把重心放在期望自己应该做的事情上,更多的时间花费在了处理学院的相关事务。现在看来,大二…

《昇思 25 天学习打卡营第 9 天 | FCN 图像语义分割 》

活动地址:https://xihe.mindspore.cn/events/mindspore-training-camp 签名:Sam9029 这一章节 出现了一个 深度学习 中经常出现的概念 全卷积网络(Fully Convolutional Networks) : 官话:FCN 主要用于图像分割领域&…

德璞资本:桥水公司如何利用AI实现投资决策的精准提升?

摘要: 在金融科技的浪潮中,桥水公司推出了一只依靠机器学习决策的创新基金,吸引了大量投资者的关注。本文将深入探讨该基金的背景、AI技术的应用、对桥水公司转型的影响,以及未来发展的前景。 新基金背景:桥水公司的创…

2024年7月2日 (周二) 叶子游戏新闻

老板键工具来唤去: 它可以为常用程序自定义快捷键,实现一键唤起、一键隐藏的 Windows 工具,并且支持窗口动态绑定快捷键(无需设置自动实现)。 卸载工具 HiBitUninstaller: Windows上的软件卸载工具 经典名作30周年新篇《恐怖惊魂夜…

MyBatis入门案例

实施前的准备工作: 1.准备数据库表2.创建一个新的springboot工程,选择引入对应的起步依赖(mybatis、mysql驱动、lombok)3.在application.properties文件中引入数据库连接信息4.创建对应的实体类Emp(实体类属性采用驼峰…

throw 和return的区别,A函数里面执行B函数 B函数异常后 不再执行A函数

function aFun() {try {bFun();console.log(22222222222);} catch (e) {// 如果bFun中抛出异常,中止aFun的执行console.log(e.message);} }function bFun() {let a 1, b 1;if (a b) {throw new Error(Stopped by bFun); // 抛出异常,停止aFun}// bFun…

python3递归目录删除N天前的文件(带有日志记录)

本来想用linux find去处理,为了装逼,写了py玩玩,删除2w个文件总共用了2毫秒。因为这个脚本有记录删除时间,你可以看到开始时间和最后删除的时间。由于只用了2毫秒,把我吓了一跳以为删错文件了!! #!/usr/bin/env python3 # -*- encoding: utf-8 -*-@File : del_N…

补浏览器环境

一,导言 // global是node中的关键字(全局变量),在node中调用其中的元素时,可以直接引用,不用加global前缀,和浏览器中的window类似;在浏览器中可能会使用window前缀:win…