Для меня важны три вещи:
1.) Существует начальный метод , который возвращает свободный интерфейс, с которым вы собираетесь работать
2.Каждый метод в классе, который реализует ваш свободный интерфейс, возвращает сам себя, чтобы вы могли продолжить цепочку - это настоящие беглые методы .
3.1012 *, который возвращает тип, который вы действительно хотите построить.
В вашем примере, поскольку у вас есть только два метода, его граница полезна - обычно у вас будет больше методов в свободном интерфейсе.В качестве альтернативы (которую я лично предпочитаю) вы можете предложить обе опции в вашем API: свободный API и более традиционный API (то есть с необязательными параметрами).
В вашем случае можно сделать что-то вроде этого:1018 * Отредактировано для ответа на комментарий.
public interface IXmlDocumentFactory<T>
{
XmlDocument Create(); //serializes just the data
IXmlDocumentFactory<T> WithSchema(XmlSchema schema); //serializes data and includes schema
}
public class DocumentFactory<T> : IXmlDocumentFactory<T>
{
private XmlSchema _schema;
private T _data;
public DocumentFactory(T data)
{
_data = data;
}
public IXmlDocumentFactory<T> WithSchema(XmlSchema schema)
{
_schema = schema;
return this;
}
public XmlDocument Create()
{
if (_schema != null)
{
//..use schema/data
return new XmlDocument();
}
else //use data
return new XmlDocument();
}
public static IXmlDocumentFactory<T> From(T data)
{
return new DocumentFactory<T>(data);
}
}
Затем вы можете использовать его так:
var xmlDoc = DocumentFactory<int>.From(42)
.WithSchema(new XmlSchema())
.Create();
var xmlDoc = DocumentFactory<int>.From(42)
.Create();