首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用多个参数实现工厂模式,每个参数都是接口

用多个参数实现工厂模式,每个参数都是接口
EN

Code Review用户
提问于 2020-10-05 13:04:22
回答 1查看 1.5K关注 0票数 3

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

对于每个组合框项,我都有一个接口和具体的实现。

我有一个SignalProcessor类,它获取参数,如下所示:

代码语言:javascript
复制
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);
    }
}

我决定根据所选的组合框值来生成和使用具体的类,以便创建下面的工厂类。

代码语言:javascript
复制
  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();
    }
}

然后按以下方式使用:

代码语言:javascript
复制
_signalProcessor = FactorySP.Create(WindowingType, FftSize, InverseSpectrum, DecimationType);
result = _signalProcessor.Process(Enumerable.Range(0, 100).Select(a => (double)a).ToArray());

有比这更好的方法来得到我想要的吗?我觉得在我使用的方法中缺少了一些东西:)我知道Factory方法不是那样的,但否则我必须创建工厂类重载的所有组合和排列。我应该使用构建器模式来创建SignalProcessor对象吗?

EN

回答 1

Code Review用户

回答已采纳

发布于 2020-10-06 07:10:45

如果我正确地理解了您的意图和代码,那么您更愿意使用抽象工厂实现而不是工厂法模式实现。

抽象工厂模式,类通过组合将对象实例化的责任委托给另一个对象。Factory方法模式使用继承,并依赖于子类来处理所需的对象实例化。

参考24幻灯片 x- 对差异的详细讨论

您的FactoryFP公开了几个方法来创建多个不同的对象(所谓的对象族)。而Factory方法的作用域是单个对象。因此抽象工厂可以依赖于多个工厂方法。

“有比这更好的办法得到我想要的东西吗?”

和往常一样,这取决于你想要什么。

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/250222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档