MinMaxLengthStringGenerator

MinMaxLengthStringGenerator

我正在开发一种用于生成某种字符串的应用程序功能。我有一个界面:

interface IStringGenerator
{
    string GenerateNext();
}


现在,我已经在具有单个构造函数和一个参数的类中实现了此接口:

class FixedLengthStringGenerator : IStringGenerator
{
    // The class needs some dependencies, but I ignored them here to keep it simple
    public FixedLengthStringGenerator(int length /*and dependencies*/)
    { . . . }

    public string GenerateNext()
    { . . . }

    .
    .
    .
}


此实现仅生成固定给定长度length的所需字符串。每次调用时GenerateNext()返回所需的字符串,直到没有剩余的字符串,然后返回null。考虑到这些,我需要IStringGenerator的另一种实现,它可以生成长度在最小值和最大值之间的字符串。我认为有这样的事情很自然:

class MinMaxLengthStringGenerator : IStringGenerator
{
    int _MinLength;
    int _MaxLength;
    int _Length;
    IStringGenerator _StringGenerator;

    public MinMaxLengthStringGenerator(int minLength, int maxLength)
    {
        _MinLength = minLength;
        _MaxLength = maxLength;

        _Length = minLength;
        _StringGenerator = new FixedLengthStringGenerator(_Length);
    }

    public string GenerateNext()
    {
        if(_Length > _MaxLength)
            return null;

        string generatedString = _StringGenerator.GenerateNext();

        if(generatedString == null)
        {
            _Length++;
            if(_Length <= _MaxLength)
            {
                _StringGenerator = new FixedLengthStringGenerator(_Length);
                return _StringGenerator.GenerateNext();
            }
            else
                return null;
        }
        else
            return generatedString;
    }
}


但是直接创建实例不是一个好主意。相反,我可以使用工厂来获取FixedLengthStringGenerator的实例。但是我仍然认为这不是一个好习惯,因为它取决于FixedLengthStringGenerator。而且,如果将来我想使用其他替代类,则无法从外部接收它。

我的问题是(从模式的角度来看)将工厂注入我的MinMaxLengthStringGenerator是否正确?

更确切地说,考虑

interface IFixedLengthStringGeneratorFactory
{
    FixedLengthStringGenerator Create(int length);
}


我应该像下面这样声明MinMaxLengthStringGenerator的构造函数吗?

public MinMaxLengthStringGenerator(int minLength, int maxLength, IFixedLengthStringGeneratorFactory factory)
{ . . . }

最佳答案

我觉得你很亲密。考虑实现此接口的工厂:

interface IStringGeneratorFactory
{
    IStringGenerator CreateFixedLengthStringGenerator(int length);

    IStringGenerator CreateMinMaxLengthStringGenerator(int minLength, int maxLength, IStringGeneratorFactory factory);

    /* other types? */
}


您在_StringGenerator内对MinMaxLengthStringGenerator的分配将变为:

_StringGenerator = _stringGeneratorFactory.CreateFixedLengthStringGenerator(_Length);


这将从FixedLengthStringGenerator中删除​​对MinMaxLengthStringGenerator具体实现的引用。

希望这可以帮助!

10-05 18:42