当前位置: 首页 > news >正文

设计模式——抽象工厂模式02

如果是工厂模式是对同一类商品进行抽象然后生产。
那么抽象工厂模式是对工厂的抽象,每个工厂都能生产多种产品,不同工厂生产的商品性质相同,但外观,品牌会略有差异。
设计模式,一定要敲代码理解
在这里插入图片描述

商品抽象

public interface Bed {void  getInfo();
}
public interface BedsideTable {void  getInfo_b();
}
public interface Chair {void  getInfo_c();
}

工厂抽象

/*** @author ggbond* @date 2024年04月01日 08:48* 一个工厂 能同时生产 床,床头柜,椅子*/
public interface Ifactory {Bed productBed();BedsideTable productBedsideTable();Chair productChair();}

具体抽象商品,看代码这里不展示了。

具体工厂

/*** @author ggbond* @date 2024年04月01日 08:53* 工厂1 负责 生产  实木床, 实木床头柜,餐厅椅*/
public class Factory01 implements Ifactory{static {System.out.println("我是工厂01");}@Overridepublic Bed productBed() {return new WoodBed();}@Overridepublic BedsideTable productBedsideTable() {return new SolidWoodBedsideTable();}@Overridepublic Chair productChair() {return new DiningChair();}
}

测试内容

public class Main {public static void main(String[] args) {Ifactory factory01=new Factory01();Bed bed=factory01.productBed();BedsideTable bedsideTable = factory01.productBedsideTable();Chair chair = factory01.productChair();bed.getInfo();bedsideTable.getInfo_b();chair.getInfo_c();System.out.println("---------");Ifactory factory02=new Factory02();Bed bed02=factory02.productBed();BedsideTable bedsideTable02 = factory02.productBedsideTable();Chair chair02 = factory02.productChair();bed02.getInfo();bedsideTable02.getInfo_b();chair02.getInfo_c();}
}

结果展示

我是工厂01
生产了一个 实木床
生产了一个 实木床头柜
生产了一个 餐椅
---------
我是工厂02
生产了一个 铁艺床
生产了一个 涂漆床头柜
生产了一个 办公椅

总结

不同工厂生产同一商品族,但商品外形,品牌可差异化。
如果仅加 新工厂,对于商品也要对应实现。实现了单一与开闭原则
如果每个工厂新增商品 如上述家具工厂新增电视柜,那么之前每个工厂内部要加 生产电视柜 方法 与电视柜抽象与实现,破坏了开闭,同时当工厂数量过多时,改动工作量亦剧增。

代码下载

代码下载

相关文章:

  • 1236. 递增三元组:做题笔记
  • acwing算法提高之图论--floyd算法及其扩展应用
  • 江协STM32:定时器定时中断和定时器定时闹钟
  • 【Python第三方库】lxml 解析器和xpath路径语言
  • 【算法练习】28:选择排序学习笔记
  • 已解决org.apache.lucene.store.AlreadyClosedException: 已经关闭异常的正确解决方法,亲测有效!!!
  • 【项目新功能开发篇】开发编码
  • vue3中播放flv流视频,以及组件封装超全
  • 纯C++设置浮点数精度
  • 4. python练习题4-水仙花数
  • 【Oracle篇】expdp/impdp高效完成全部生产用户的全库迁移(第四篇,总共四篇)
  • 【考研经验贴】24考研860软件工程佛系上岸经验分享【丰富简历、初复试攻略、导师志愿、资料汇总】
  • Java基础 - 代码练习
  • 【算法每日一练]-动态规划#POJ1185:炮兵阵地 #互不侵犯
  • Qt QML的枚举浅用
  • (三)从jvm层面了解线程的启动和停止
  • 【EOS】Cleos基础
  • 〔开发系列〕一次关于小程序开发的深度总结
  • AHK 中 = 和 == 等比较运算符的用法
  • linux安装openssl、swoole等扩展的具体步骤
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Nodejs和JavaWeb协助开发
  • PAT A1120
  • PHP面试之三:MySQL数据库
  • python学习笔记 - ThreadLocal
  • Terraform入门 - 3. 变更基础设施
  • 爱情 北京女病人
  • 大整数乘法-表格法
  • 当SetTimeout遇到了字符串
  • 猴子数据域名防封接口降低小说被封的风险
  • 开源SQL-on-Hadoop系统一览
  • 利用jquery编写加法运算验证码
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 我从编程教室毕业
  • 协程
  • 再次简单明了总结flex布局,一看就懂...
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​secrets --- 生成管理密码的安全随机数​
  • #stm32整理(一)flash读写
  • $$$$GB2312-80区位编码表$$$$
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (Ruby)Ubuntu12.04安装Rails环境
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (九)c52学习之旅-定时器
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)shell调试方法
  • ***详解账号泄露:全球约1亿用户已泄露
  • .apk 成为历史!
  • .net core控制台应用程序初识