问题描述
我对带有多个参数的工厂方法有些困惑,其中所有参数都可以由用户从GUI更改,如下图所示。
对于每个组合框项目,我都有一个界面和具体的实现。
我有一个SignalProcessor类,它通过以下3个接口获取参数:
<Popover
id={id}
open={open}
anchorEl={anchorEl}
onClose={handleClose}
value={value}
anchorOrigin={{
vertical: 'top',horizontal: 'center',}}
transformOrigin={{
vertical: 'top',}}
PaperProps={{
style: { width: '100%' },}}
我决定根据所选的组合框值来生产和使用具体的类,因此创建了以下工厂类。
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();
}
}
有没有比这更好的方法来得到我想要的东西?我觉得我使用的方法中缺少一些东西:) 我知道Factory方法不是那样的,但是否则我必须创建工厂类重载的所有组合和排列。
请帮助我改善类的实现。
最佳瑞格斯, 哈坎
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)