我对Factory方法有一点困惑,它包含多个参数,在这些参数中,所有参数都可以通过用户从GUI更改,如下图所示。

对于每个组合框项,我都有一个接口和具体的实现。
我有一个SignalProcessor类,它获取参数,如下所示:
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());有比这更好的方法来得到我想要的吗?我觉得在我使用的方法中缺少了一些东西:)我知道Factory方法不是那样的,但否则我必须创建工厂类重载的所有组合和排列。我应该使用构建器模式来创建SignalProcessor对象吗?
发布于 2020-10-06 07:10:45
如果我正确地理解了您的意图和代码,那么您更愿意使用抽象工厂实现而不是工厂法模式实现。
抽象工厂模式,类通过组合将对象实例化的责任委托给另一个对象。Factory方法模式使用继承,并依赖于子类来处理所需的对象实例化。
参考24幻灯片 x- 对差异的详细讨论
您的FactoryFP公开了几个方法来创建多个不同的对象(所谓的对象族)。而Factory方法的作用域是单个对象。因此抽象工厂可以依赖于多个工厂方法。
“有比这更好的办法得到我想要的东西吗?”
和往常一样,这取决于你想要什么。
https://codereview.stackexchange.com/questions/250222
复制相似问题