C# 简单工厂模式(构建简单工厂)

构建简单工厂

现在很容易给出简单工厂类。只检测逗号是否存在,然后返回其中的一个类的实例。

public class NameFactory
{public NameFactory(){}public Namer getName(string name){int i=name.IndexOf(",");if(i>0)return new LastFirst(name);else{return new FirstFirst(name);}}
}

使用工厂

接下来看看怎样把上述部分组合在一起。为了响应Compute把按钮单击事件,用一个NameFactory
实例返回正确的派生类。

private void btCompute_click(object sender,System.EventArgs e)
{Namer nm=nameFact.getName(txName.Text);txFirst.Text=nm.getFrname();txLast.Text=nm.getLname();
}

然后调用get重方法和getLname方法获得正确拆分的名字。这里不需要知道使用的是哪一
个派生类,工厂为我们提供了这个类,所需要知道的就是它有两个取出()方法。

我们构建了一个简单用户接口,允许用户以两种方式输入名字,然后显示拆分后的名字。

输入一个名字,然后单击Compute按钮,拆分后的名字显示在下面的文本域中。该程序的关键
之处在于Compute方法,它取回输入的文本,获得Namer类的实例,然后显示结果。

这就是简单工厂模式的基本原理。创建了一个抽象工厂,它决定返回哪一个类的实例并将该实
例返回。接下来可以调用那个类实例的方法,但不需要知道具体使用的是哪一个子类,这种方法把
和数据相关的问题与类的其他方法分隔开来。

数学计算中的工厂模式

大多数使用工厂模式的人都认为,工厂模式可以作为简化杂乱的编程类的工具。然而,工厂模
式用在执行数学运算的程序里也是非常合适的。例如,在快速傅里叶变换(FFT)中,下列四个方
程式要对大量的点对重复执午多遍,才能完成转换。根据这些计算结果绘制的图形形状,将下面
匹个方程式组成FFT“Butterfly(蝴蝶)"类的一个实例。四个方程式如下所示:
R1′=R1+R2cos⁡(y)−I2sin⁡(y)R_{1}' = R_{1} + R_{2}\cos(y) - I_{2}\sin(y)R1=R1+R2cos(y)I2sin(y) (1)

R2′=R1−R2cos⁡(y)+I2sin⁡(y)R_{2}' = R_{1} - R_{2}\cos(y) + I_{2}\sin(y)R2=R1R2cos(y)+I2sin(y) (2)

I1′=I1+R2sin⁡(y)+I2cos⁡(y)I_{1}' = I_{1} + R_{2}\sin(y) + I_{2}\cos(y)I1=I1+R2sin(y)+I2cos(y) (3)

I2′=I1−R2sin⁡(y)−I2cos⁡(y)I_{2}' = I_{1} - R_{2}\sin(y) - I_{2}\cos(y)I2=I1R2sin(y)I2cos(y) (4)
当角度y为零时,每次遍历数据时,仍然需要多次计算。这种情况下,可将复杂的数学计算
简化为公式(5)~(8):
R1′=R1+R2R_{1}' = R_{1} + R_{2}R1=R1+R2 (5)
R2′=R1−R2R_{2}' = R_{1} - R_{2}R2=R1R2 (6)
I1′=I1+I2I_{1}' = I_{1} + I_{2}I1=I1+I2 (7)
I2′=I1−I2I_{2}' = I_{1} - I_{2}I2=I1I2 (8)

我们先定义一个保存复数的类。

public class Complex
{float real;float imag;public Complex(float r,float i){real=r;imag=i;}public void setReal(flaot r){real=r;}public void setImag(float i){imag=i;}public float getReal(){return real;}public float getImag(){return imag;}
}

基类Butterfly是一个抽象类,任何一个具体类都要填充Execute命令的实现过程。

public abstract class Bufferfly
{float y;public Bufferfly(){public Bufferfly(float angle){y=angle;}abstract public void Execute(Complex X,Complex y);}
}

接下来在Butty的基础上创建一个简单的加法类,它实现了公式(5~8)的加法和减法运算

class AddBufferfly:AddBufferfly
{float oldr1,old2;public AddBufferfly(float angle){public override void Execute(Complex xi,Complex xj){oldr1=xi.getReal();oldi1=xi.getImag();xi.setReal(oldr1+xj.getReal());xj.setReal(oldr1- xj.getReal());xi.setImag(oldi1+xj.getImag());xj.setImag(oldi1-xj.getImag());}}
}

TrigButterny类与此类似,只是Execute方法包含了公式(1)、(4)中的三角函数的计算

public class TrigButterfly:TrigButterfly{float y,oldr1,oldi1;float cosy,siny;float r2cosy,r2siny,i2cosy,i2siny;}public TrigButterfly(float angle){y=angle;cosy=(float)Math.Cos(y);siny=(float)Math.Sin(y);}public override void Execute(Complex xi,Complex xj){oldr1=xi.getReal();oldi1=xi.getImag();r2cosy=xj.getReal()*cosy;r2siny=xj.getReal()*siny;i2cosy=xj.getImag()*cosy;i2siny=xj.getImag()*siny;xi.setReal(oldr1+r2cosy+i2siny);xi.setImag(oldi1-r2siny+i2cosy2);xj.setReal(oldr1-r2cosy-i2siny);xj.setImag(oldi1+r2siny-i2cosy);}

然后创建一个简单工厂类,它决定返回哪一个类实例。因为已经创建了类,所以,我
们把T厂类称为Cocoon(茧)。这里不需要实例化Cocoon,所以将它的方法声明为静态的。

public class Cocoon
{static public Butterfly getButterfly(float y){if(y!=0)return new TrigButterfly(y);elsereturn new addButterfly(y);}
}

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

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

相关文章

uniappx与uniapp的区别

uniappx与uniapp的定位差异uniappx是DCloud推出的扩展版框架,基于uniapp进行功能增强,主要面向需要更复杂原生交互或跨平台深度定制的场景。uniapp则是标准版,适用于常规的跨平台应用开发,强调开发效率和代码复用。功能扩展性unia…

vue实现拖拉拽效果,类似于禅道首页可拖拽排布展示内容(插件-Grid Layout)

vue实现拖拉拽效果(插件-Grid Layout) 这个是类似与禅道那种首页有多个指标模块,允许用户自己拼装内容的那种感觉。 实现效果 插件资料 vue3版本 如果项目是vue3 的话使用的是 Grid Layout Plus。 官网:https://grid-layout-pl…

在Excel和WPS表格中打印时加上行号和列标

在电脑中查看excel和WPS表格的工作表时,能看到行号(12345.....)和列标(ABCDE...),但是打印出来以后默认是没有行号和列标的,如果要让打印(或者转为PDF)出来以后仍能看到行…

设计模式:原型模式(Prototype Pattern)

文章目录一、原型模式的概念二、原型模式的结构三、原型注册机制四、完整示例代码一、原型模式的概念 原型模式是一种创建型设计模式, 使你能够复制已有对象, 而又无需使代码依赖它们所属的类。通过复制(克隆)已有的实例来创建新的…

Linux系统网络管理

一、网络参数配置1、图形化配置#开启 [rootlocalhost ~]# systemctl start NetworkManager #关闭 [rootlocalhost ~]# systemctl stop NetworkManager #关闭并开机不自启 [rootlocalhost ~]# systemctl disable --now NetworkManager #开启并开机自启 [rootlocalhost ~]# syste…

服务器初始化

服务器初始化文章目录服务器初始化1. 配置国内 Yum 源(加速软件安装)2. 更新系统与安装必备工具3. 网络连接验证4. 配置主机名5. 同步时间6. 配置防火墙 (两种方式)6.1 iptables整体思路详细步骤第 1 步:停止并禁用 Firewalld第 2 步&#xf…

基于YOLOv11训练无人机视角Visdrone2019数据集

【闲鱼服务】 基于YOLOv11训练无人机视角Visdrone2019数据集Visdrone2019数据集介绍数据集格式数据预处理yolov11模型训练数据分布情况可视化训练结果Visdrone2019数据集介绍 VisDrone 数据集 是由中国天津大学机器学习和数据挖掘实验室 AISKYEYE 团队创建的大规模基准。它包含…

基于Springboot 的智能化社区物业管理平台的设计与实现(代码+数据库+LW)

摘 要随着智慧社区的普及,传统的物业管理方式已经无法满足现代社区的需求。目前,很多社区管理中存在信息不畅通、工作效率低以及居民服务体验不佳等问题。为了解决这些问题,我们基于SpringBoot框架开发了一套智能化社区物业管理平台&#xf…

【深度学习新浪潮】SAM 2实战:Meta新一代视频分割模型的实时应用与Python实现

引言:从图像到视频的分割革命 上周AI领域最引人注目的计算机视觉进展,当属Meta在SAM(Segment Anything Model)基础上推出的SAM 2模型持续引发的技术热潮。尽管SAM 2最初发布于2024年,但最新更新的2.1版本(2024年9月发布)凭借其突破性的实时视频分割能力,在自动驾驶、影…

sqli-labs靶场安装与使用指导教程(3种方法:通用版、php7版、Docker版)

目录 一、SQLI-LABS靶场 1、核心特点 2、关卡难度 二、源码安装法 1、开启Web服务和数据库服务 2、靶场源码下载 (1)通用版本 (2)PHP7版本 3、部署sqli-labs靶场 (1)确认网站根目录位置 &#x…

从零开始配置前端环境及必要软件安装

从零开始配置前端环境及必要软件安装一、安装编辑器二、安装浏览器三、安装Git版本控制工具四、Node.js 和 npm 环境变量配置1. 安装 Node.js 和 npm2. 配置全局模块和缓存目录3. 设置环境变量4. 更换 npm 镜像源5. 测试配置五、hosts文件六、辅助应用markdown(笔记…

神经网络模型搭建及手写数字识别案例

代码实现:import torch print(torch.__version__) from torch import nn from torch.utils.data import DataLoader from torchvision import datasets from torchvision.transforms import ToTensor training_data datasets.MNIST(rootdata,trainTrue,downloadTru…

CRMEB标准版PC扫码登录配置教程(PHP版)

需要在开放平台创建网站应用 微信开放平台地址:https://open.weixin.qq.com/ 1、注册网站应用 2、填写信息,网站地址填写前台访问的域名就行 3、复制开放平台AppId和开放平台AppSecret 4、粘贴到后台应用配置的PC站点配置里

AmazeVault 核心功能分析,认证、安全和关键的功能

系列文章目录 Amazevault 是一款专注于本地安全的桌面密码管理器 AmazeVault 核心功能分析,认证、安全和关键的功能 AmazeVault 快速开始,打造个人专属桌面密码管理器 文章目录系列文章目录前言一、认证系统核心组件图形解锁实现图形锁控件 (PatternLoc…

Coze用户账号设置修改用户昵称-后端源码

前言 本文将深入分析Coze Studio项目的用户昵称修改功能后端实现,通过源码解读来理解整个昵称更新流程的架构设计和技术实现。用户昵称修改作为用户个人信息管理系统的重要组成部分,主要负责处理用户显示名称的更新和管理。 昵称修改功能相对简单但不失重…

基于WebTransport(底层QUIC)实现视频传输(HTML+JavaScript)

工作目录和基本操作见博客《基于HTTP3的WebTransport实践》,在此仅展示服务器端和客户端代码。 服务器端 import { readFile } from "node:fs/promises"; import { createServer } from "node:https"; import {Server} from "socket.io&qu…

Git 怎么仓库迁移?error: remote origin already exists.怎么解决

1. 确认本地已经有完整的 旧 仓库你本地应该有旧的项目,并且能看到 .git 文件夹。如果没有,可以先从旧仓库克隆下来:git clone 旧仓库git地址 cd 旧代码目录比如:git clone https://gitee.com/star-information/esflow-pro-api.gi…

【语法】【C+V】本身常用图表类型用法快查【CSDN不支持,VSCODE可用】

文章目录Mermaid 简介Mermaid 由三部分组成Mermaid 的使用方法复杂图表结构的技巧饼图简介饼图语法饼图示例雷达图简介雷达图语法雷达图语法细节标题轴曲线选项雷达图示例时间线简介时间线语法时间线示例树形图简介树形图语法树形图示例数据包图简介数据包图语法1:数…

Anaconda下载安装教程(附Anaconda安装包)

Anaconda下载安装教程(附Anaconda安装包)获取:python开发工具包丨夸克网盘-资源免费下载 有位小粉丝刚刚入门python,问我怎么安装Anaconda,于是我帮他找了一个详细的Anaconda安装教程和安装包。 Anaconda其实是一个p…

那我现在有3个输入 9层神经元 每层神经元数为 3 9 3 5 6 2 3 9 8 请给出我所有的权重矩阵

问题1 那我现在有3个输入 9层神经元 每层神经元数为 3 9 3 5 6 2 3 9 8 请给出我所有的权重矩阵 明白,我们来系统地列出你的 9层全连接网络 的权重矩阵。1️⃣ 网络结构 输入层:3 个神经元隐藏层/输出层:9 层神经元数分别为 [3,9,3,5,6,2,3,9…