设计模式(三):抽象工厂模式

设计模式(三):抽象工厂模式

  • 1. 抽象工厂模式的介绍
  • 2. 抽象工厂模式的类图
  • 3. 抽象工厂模式的实现
    • 3.1 创建摩托车的接口
    • 3.2 创建摩托车的具体实现
    • 3.3 创建汽车的接口
    • 3.4 创建汽车的具体产品
    • 3.5 创建抽象工厂
    • 3.6 创建具体工厂
    • 3.7 创建工厂生成器
    • 3.8 使用工厂生成器获取工厂,通过工厂获取产品

1. 抽象工厂模式的介绍

抽象工厂模式(Abstract Factory Pattern)属于创建型模式,是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。

抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

通过使用抽象工厂模式,可以将客户端与具体产品的创建过程解耦,使得客户端可以通过工厂接口来创建一族产品。

抽象工厂模式包含4个核心角色:

  • 抽象工厂(Abstract Factory):声明了一组用于创建产品对象的方法,每个方法对应一种产品类型。抽象工厂可以是接口或抽象类。
  • 具体工厂(Concrete Factory):实现了抽象工厂接口,负责创建具体产品对象的实例。
  • 抽象产品(Abstract Product):定义了一组产品对象的共同接口或抽象类,描述了产品对象的公共方法。
  • 具体产品(Concrete Product):实现了抽象产品接口,定义了具体产品的特定行为和属性。

2. 抽象工厂模式的类图

在这里插入图片描述

3. 抽象工厂模式的实现

3.1 创建摩托车的接口

package blog;/*** 摩托车*/
public interface Motorcycle {void by();
}

3.2 创建摩托车的具体实现

package blog;/*** 踏板摩托车*/
public class Scooter implements Motorcycle{@Overridepublic void by() {System.out.println("骑着一辆踏板车");}
}
package blog;/*** 弯梁摩托车*/
public class UnderBone implements Motorcycle{@Overridepublic void by() {System.out.println("骑着一辆弯梁车");}
}

3.3 创建汽车的接口

package blog;/*** 汽车*/
public interface Car {void drive();
}

3.4 创建汽车的具体产品

package blog;/*** suv*/
public class Suv implements Car{@Overridepublic void drive() {System.out.println("开着一辆SUV");}
}
package blog;/*** mpv*/
public class Mpv implements Car{@Overridepublic void drive() {System.out.println("开着一辆MPV");}
}

3.5 创建抽象工厂

package blog;/*** 抽象工厂*/
public interface AbstractFactory {Car getCar(String type);Motorcycle getMotorCycle(String type);
}

3.6 创建具体工厂

package blog;/*** 摩托车工厂*/
public class MotorCycleFactory implements AbstractFactory {@Overridepublic Car getCar(String type) {return null;}@Overridepublic Motorcycle getMotorCycle(String type) {try {Class<?> aClass = Class.forName(type);return (Motorcycle) aClass.getDeclaredConstructor().newInstance();} catch (Exception e) {throw new RuntimeException(e);}}
}
package blog;/*** 汽车工厂*/
public class CarFactory implements AbstractFactory {@Overridepublic Car getCar(String type) {try {Class<?> aClass = Class.forName(type);return (Car)aClass.getDeclaredConstructor().newInstance();} catch (Exception e) {throw new RuntimeException(e);}}@Overridepublic Motorcycle getMotorCycle(String type) {return null;}
}

3.7 创建工厂生成器

package blog;/*** 工厂生成器*/
public class FactoryProducer {public static AbstractFactory getFactory(String type) {if ("car".equals(type)) {return new CarFactory();}if ("motorcycle".equals(type)) {return new MotorCycleFactory();}return null;}
}

3.8 使用工厂生成器获取工厂,通过工厂获取产品

package blog;public class AbstractFactoryDemo {public static void main(String[] args) {// 获取汽车工厂AbstractFactory carFactory = FactoryProducer.getFactory("car");// 获取suvCar suv = carFactory.getCar("blog.Suv");suv.drive();// 获取mpvCar mpv = carFactory.getCar("blog.Mpv");mpv.drive();// 获取摩托车工厂AbstractFactory motorcycleFactory = FactoryProducer.getFactory("motorcycle");// 获取scooterMotorcycle scooter = motorcycleFactory.getMotorCycle("blog.Scooter");scooter.by();// 获取UnderBoneMotorcycle underBone = motorcycleFactory.getMotorCycle("blog.UnderBone");underBone.by();}
}

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

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

相关文章

常见GIS坐标系的坐标转换

几种常见的 GIS 坐标系的简单介绍及坐标数据的相互转换方法。 一、坐标系介绍 1. WGS-84&#xff1a;大地坐标系 国际通用坐标系&#xff0c;也叫地球坐标系。各 GPS 设备、境外地图&#xff08;包括但不限于谷歌地图、高德地图、百度地图的境外版&#xff09;等使用的坐标系…

Android 监听音频焦点变化

在 Android 中&#xff0c;监听音频焦点变化意味着您可以获得关于音频焦点状态的通知&#xff0c;并针对焦点变化执行相应的操作。音频焦点是指哪个应用程序或组件有权播放音频的能力。 通过监听音频焦点变化&#xff0c;您可以根据不同的焦点状态进行适当的音频处理&#xff…

苹果一次性开源了8个大模型! 包含模型权重、训练日志和设置,OpenELM全面开源

不以开放性著称的苹果居然同时开源了大模型的权重、训练和评估框架&#xff0c;涵盖训练日志、多个保存点和预训练设置。同时升级计算机视觉工具包 CVNets 为 CoreNet&#xff01;支持 OpenELM&#xff01; ▲图1.由Stable Diffusion3生成。 OpenELM是Apple苹果公司最新推出的…

律师口才训练技巧课程介绍?

律师口才训练技巧课程介绍 一、课程背景与目标 律师口才作为法律职业的核心能力之一&#xff0c;对于律师在**辩论、法律咨询、谈判协商等场合的表现具有至关重要的作用。然而&#xff0c;许多律师在口才方面存在不足&#xff0c;难以充分发挥自己的专业能力。因此&#xff0c;…

底层逻辑(1) 是非对错

底层逻辑(1) 是非对错 关于本书 这本书的副标题叫做&#xff1a;看清这个世界的底牌。让我想起电影《教父》中的一句名言&#xff1a;花半秒钟就看透事物本质的人&#xff0c;和花一辈子都看不清事物本质的人&#xff0c;注定是截然不同的命运。 如果你看过梅多丝的《系统之美…

从ElasticSearch7开始一个索引里面只允许有一个映射

从ElasticSearch7开始一个索引里面只允许有一个映射 在ElasticSearch7版本之前&#xff0c;ES的一个索引里面可以有多个映射关系。为什么呢&#xff1f;因为ES最初设计的时候是类比于像mysql这样的关系型数据库&#xff0c;比如说ES的索引就相当于是关系型数据库中的数据库&am…

桶排序(Bucket Sort)

. - 力扣&#xff08;LeetCode&#xff09; 这道题可以使用桶排序来做 桶排序&#xff08;Bucket Sort&#xff09;是一种排序算法&#xff0c;其工作原理是将数组分到有限数量的桶子里。每个桶子再个别排序&#xff08;有可能再使用别的排序算法或是以递归方式继续使用桶排序…

“AI 程序员入职系列”第二弹:如何利用通义灵码光速改写项目编程语言?

通义灵码入职阿里云云原生团队后&#xff0c;已经展示过 Ta 生成单元测试和自动生成代码的强大实力。今天&#xff0c;阿里云后端工程师云徊将从项目开发的实际需求出发&#xff0c;演示通义灵码在开发工作中可提供的帮助。 通义灵码在 Git 开发项目中起到了哪些作用&#xff…

WildCard开通GitHub Copilot

更多AI内容请关注我的专栏&#xff1a;《体验AI》 期待您的点赞&#x1f44d;收藏⭐评论✍ WildCard开通GitHub Copilot GitHub Copilot 简介主要功能工作原理 开通过程1、注册Github账号2、准备一张信用卡或虚拟卡3、进入github copilot页4、选择试用5、选择支付方式6、填写卡…

Flutter Get国际化和实现原理简析

Flutter Get国际化入门和实现原理简析 前言使用方法1、配置依赖包2、配置国际化相关参数3、配置en_US和zh_CN4、配置Translations5、 构建的页面:原理分析1、tr原理分析2、 updateLocale原理分析参考资料:前言 Flutter的Get插件提供了国际化功能,使用起来很方便,下面就其简…

设计模式:里氏代换原则(Liskov Substitution Principle,LSP)介绍

里氏代换原则&#xff08;Liskov Substitution Principle&#xff0c;LSP&#xff09;是面向对象设计原则的一部分&#xff0c;它强调子类对象应该能够替换其父类对象而不影响程序的正确性。换句话说&#xff0c;子类对象应该可以在不改变程序正确性的前提下替换掉父类对象。 …

为什么单片机控制电机需要加电机驱动

通常很多地方只是单纯的单片机MCU没有对电机的驱动能力&#xff0c;或者是介绍关于电机驱动的作用&#xff0c;如&#xff1a; 提高电机的效率和精度。驱动器采用先进的电子技术和控制算法&#xff0c;能够精准控制电机的参数和运行状态&#xff0c;提高了电机的效率和精度。拓…

Git命令汇总(持续更新)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

【Flutter 面试题】 setState 在哪种场景下可能会失效?

【Flutter 面试题】 setState 在哪种场景下可能会失效? 文章目录 写在前面口述回答补充说明示例1:`setState` 在已销毁的Widget中使用示例2:在构建过程中调用`setState`写在前面 🙋 关于我 ,小雨青年 👉 CSDN博客专家,GitChat专栏作者,阿里云社区专家博主,51CTO专家…

【Hello算法】 > 第 3 关 >栈与队列

数据结构 之 数组与链表 1 栈 / 栈的常见操作、实现、应用2 队列 /队列的常见操作、实现、应用3 双向队列4 Tips ———————————————————————————————————————————————————————————- ————————————————…

Hybrid Homomorphic Encryption:SE + HE

参考文献&#xff1a; [NLV11] Naehrig M, Lauter K, Vaikuntanathan V. Can homomorphic encryption be practical?[C]//Proceedings of the 3rd ACM workshop on Cloud computing security workshop. 2011: 113-124.[MJS16] Maux P, Journault A, Standaert F X, et al. To…

STM32应用开发教程进阶--UART串口重定向(printf)

实现目标 1、掌握STM32 HAL库的串口重定向 2、具体目标&#xff1a;1、实现printf “打印”各种常用的类型的数据变量 一、串口“打印” UART串口通信协议是我们常用的通信协议&#xff08;UART、I2C、SPI等&#xff09;之一&#xff0c;全称叫做通用异步收发传输器&#xf…

Druid高性能数据库连接池?SpringBoot整合MyBatis整合SpringMVC整合Druid

文章目录 Druid高性能数据库连接池&#xff1f;SpringBoot整合MyBatis整合SpringMVC整合Druid异常记录spring-boot-starter-parent作用Druid介绍什么是数据库连接池&#xff1f;为什么选择Druid数据库连接池整合SpringBoot,MyBatis,SpringMVC,Druid到Maven项目的真个流程pom文件…

Android isNetworkConnected如何判断APP连接到了无网络热点

在开发移动应用时&#xff0c;处理网络状态是一项基础且关键的任务。尤其是辨别出设备是否连接到了一个实际上没有互联网接入的WiFi热点&#xff08;比如需要登录或者付费才能上网的公共Wi-Fi&#xff09;&#xff0c;对于保持良好用户体验非常重要。 第一步&#xff1a;基本网…

OSPF域间路由防环原则

1.域间路由防环原则 ①原则一 1&#xff09;为了避免区域间的环路&#xff0c;OSPF规定不同区域间的路由交互只能通过ABR实现。 2&#xff09;ABR是连接到骨干区域的&#xff0c;所以在区域设计上规定&#xff0c;所有非骨干区域都要连接到骨干区域。区 域间的通讯需要通…