设计模式-创建型-工厂模式

embedded/2024/11/24 8:35:28/

1.概念

由多个不同的工厂来替我们完成生产对象的操作,不同的工厂生产不同的对象

2.作用

不再会违背OCP原则,要添加新的产品类会相应添加对应的工厂类,不会修改到已有工厂的代码。
调用者不再关心产品的创建,实现职责分离

3.应用场景

对象的创建步骤比较复杂,可以用工厂来进行封装。
希望隐藏对象创建的具体实现
需要解耦对象的使用和创建过程

4.特点

对象的创建与使用代码解耦
使用工厂来获取对象,而不是构造器

5.类与对象关系

5.1类图

在这里插入图片描述

5.2说明

在工厂模式中我们会有四种角色:

  • 抽象产品:所有具体产品的接口,决定这些产品共有的特性或行为
  • 具体产品:具体的产品,就是我们客户端实际要使用的对象
  • 抽象工厂:所有工厂类的接口
  • 具体工厂:每个具体产品都有对应的具体工厂类

6.实现

// 抽象产品类
interface Vehicle {void drive();
}// 具体产品类:汽车
class Car implements Vehicle {@Overridepublic void drive() {System.out.println("Driving a car.");}
}// 具体产品类:自行车
class Bicycle implements Vehicle {@Overridepublic void drive() {System.out.println("Riding a bicycle.");}
}// 工厂类
class VehicleFactory {// 根据类型创建对应的交通工具对象public static Vehicle createVehicle(String type) {if (type.equals("car")) {return new Car();} else if (type.equals("bicycle")) {return new Bicycle();} else {throw new IllegalArgumentException("Unknown vehicle type: " + type);}}
}// 客户端代码
public class FactoryPatternDemo {public static void main(String[] args) {Vehicle car = VehicleFactory.createVehicle("car");car.drive();Vehicle bicycle = VehicleFactory.createVehicle("bicycle");bicycle.drive();}
}

http://www.ppmy.cn/embedded/140076.html

相关文章

【MATLAB源码-第221期】基于matlab的Massive-MIMO误码率随着接收天线变化仿真,对比ZF MMSE MRC三种检测算法。

操作环境: MATLAB 2022a 1、算法描述 1. 系统背景与目标 无线通信系统的发展极大地推动了现代通信技术的进步,从移动通信到无线局域网,甚至是物联网,均依赖于无线通信系统的高效和可靠性。在无线通信系统中,核心目标…

【游戏开发】【Unity】基本的Unity概念

Unity是一款非常流行的游戏开发引擎,它支持跨平台、组件化设计,并使用C#作为脚本语言,让开发者能够轻松创建复杂而灵活的游戏系统。在Unity的开发中,我们常常会使用到资源、场景、游戏对象、组件、脚本、预制件以及包等概念。本文将详细介绍这些核心要素,帮助你更好地理解…

Linux---ps命令

​​​​​​Linux ps 命令 | 菜鸟教程 (runoob.com) process status 用于显示进程的状态 USER: 用户名,运行此进程的用户名。PID: 进程ID(Process ID),每个进程的唯一标识号%CPU: 进程当前使用的CPU百分比%MEM: 进程当前使用的…

基于YOLOv8深度学习的扰乱公共秩序打架异常行为检测系统研究与实现(PyQt5界面+数据集+训练代码)

随着智能监控技术和人工智能的发展,基于深度学习的行为检测技术在公共安全和防范领域中发挥着越来越重要的作用。传统的监控系统通常依赖于人工监控,这不仅耗费大量的人力和时间,且容易因为人的疲劳或疏忽而漏检关键的异常行为。而近年来&…

Leetcode 生命游戏

以下是上述Java代码的算法思想及其逻辑的中文解释: 算法思想 这段代码实现了LeetCode第289题“生命游戏”的解决方案。核心思想是: 利用原地修改的方式(in-place)存储下一状态的变化: 通过引入额外的状态值&#xff0…

springmvc 用了 @RequestMapping 是不是可以不用

springmvc 用了 RequestMapping 是不是可以不用 Controller 关系 RequestMapping 是用来映射请求的,可以注解在类或方法上。当注解在类上时,表示该类中的所有响应请求的方法都是以该地址作为父路径;当注解在方法上时,表示该方法响…

程序地址空间

程序地址空间 研究平台 kernel2.6.3232位平台 程序地址空间 除了栈会向下递减空间大小 程序地址空间更应该叫做进程地址空间或者虚拟地址空间,它是一个系统的概念而不是语言层的概念 特别需要注意的是程序地址空间不是内存!!!…

开源生态发展合作倡议

在信息技术发展的浪潮中,开源已成为全球创新的强劲引擎,深刻影响着各行各业的发展。今天,我们站在新的历史起点上,肩负着推动开源生态发展的重任。在此,开源欧拉(openEuler)、龙蜥(O…