design-patterns - 如何实现具有多个参数且每个参数都是接口的工厂模式
问题描述
我对具有多个参数的工厂方法有点困惑,其中所有参数都可以由用户从 GUI 更改,如下图所示。
对于每个组合框项,我都有一个接口和具体实现。
我有一个 SignalProcessor 类,它作为以下 3 个接口获取参数:
public interface ISignalProcessor
{
double[] Process(double[] data);
}
public class SignalProcessor : ISignalProcessor
{
private IFft _fft;
private IWindowing _windowing;
private IInverseSpectrum _inverseSpectrum;
private IDecimation _decimation;
public SignalProcessor(IWindowing windowing, IFft fft, IInverseSpectrum inverseSpectrum, IDecimation decimation)
{
_windowing = windowing;
_fft = fft;
_inverseSpectrum = inverseSpectrum;
_decimation = decimation;
}
public double[] Process(double[] data)
{
var windowingResult = _windowing.Calculate(data);
var fftResult = _fft.Calculate(windowingResult);
var inverseSpectrumResult = _inverseSpectrum.Calculate(fftResult);
return _decimation.Calculate(inverseSpectrumResult);
}
}
我决定根据选定的组合框值生成和使用具体类,因此创建了以下工厂类。
public static class FactorySP
{
public static ISignalProcessor Create(string windowingType, int fftSize, bool isInverse, string decimationType)
{
return new SignalProcessor(CreateWindowing(windowingType), CreateFft(fftSize), CreateInverseSpectrum(isInverse), CreateDecimation(decimationType));
}
private static IWindowing CreateWindowing(string windowingType)
{
switch (windowingType)
{
case "Triangular":
return new Triangular();
case "Rectangular":
return new Rectangular();
case "Hanning":
return new Hanning();
}
}
private static IFft CreateFft(int fftSize)
{
switch (fftSize)
{
case 128:
return new Fft128();
case 256:
return new Fft256();
case 512:
return new Fft512();
default:
return new FftNull();
}
}
private static IInverseSpectrum CreateInverseSpectrum(bool isInverse)
{
if (isInverse)
return new InverseSpectrumTrue();
return new InverseSpectrumFalse();
}
private static IDecimation CreateDecimation(string decimationType)
{
if (decimationType == "RealTimeDecimation")
return new RealTimeDecimation();
return new SweepDecimation();
}
}
然后使用如下:
_signalProcessor = FactorySP.Create(WindowingType, FftSize, InverseSpectrum, DecimationType);
result = _signalProcessor.Process(Enumerable.Range(0, 100).Select(a => (double)a).ToArray());
有没有比这更好的方法来获得我想要的东西?我觉得我使用的方法中缺少一些东西:) 我知道工厂方法不是那样的,但否则我必须创建工厂类重载的所有组合和排列。
请帮助我改进课程实施。
最好的问候,哈坎
解决方案
您正在寻找的是抽象工厂设计模式。
当创建对象需要更多参数时,您还可以检查 Builder Design Pattern。
推荐阅读
- php - 页脚脚本在 codeigniter 中不起作用
- javascript - 我们可以从一个无状态组件传递多个道具并将其作为另一个无状态组件中的单个参数获取吗?
- java - Spring Boot 在部署为传统战争时尝试运行嵌入式 Tomcat
- php - Laravel 传递可选变量来查看
- java - 具有两个具有相同值但不同存储桶索引的键对象的 Hashmap
- linux - 使用 bash 脚本将文本转换为时间格式
- firebase - 使用自定义身份验证系统在 iOS 上使用 Firebase 进行身份验证
- python - 如何更改动画中的变量。Python中的Funcanimation函数?
- python-3.x - 如何按值对字典进行排序并将排序后的字典存储在同一个字典中?
- intellij-idea - IntelliJ 中的 Mocha 运行配置