Tôi dường như bị kẹt trong một tình huống khó xử về mô hình Flyweight.Vấn đề về Flyweight và Factory với IDisposable
Trước tiên, hãy nói rằng tôi có một loại dùng một lần DisposableFiddle
và một nhà máy FiddleFactory
:
public interface DisposableFiddle : IDisposable
{
// Implements IDisposable
}
public class FiddleFactory
{
public DisposableFiddle CreateFiddle(SomethingThatDifferentiatesFiddles s)
{
// returns a newly created fiddle.
}
}
Sau đó, theo ý kiến của tôi, nó khá rõ ràng đối với các khách hàng của FiddleFactory
rằng nhà máy tuyên bố không có quyền sở hữu của fiddle tạo và rằng đó là trách nhiệm của khách hàng khi vứt bỏ fiddle khi thực hiện với nó.
Tuy nhiên, chúng ta hãy thay nói rằng tôi muốn chia sẻ fiddles giữa khách hàng bằng cách sử dụng các Flyweight pattern:
public class FiddleFactory
{
private Dictionary<SomethingThatDifferentiatesFiddles, DisposableFiddle> fiddles = new ...;
public DisposableFiddle CreateFiddle(SomethingThatDifferentiatesFiddles s)
{
// returns an existing fiddle if a corresponding s is found,
// or a newly created fiddle, after adding it to the dictionary,
// if no corresponding s is found.
}
}
Sau đó, tôi cảm thấy đạo đức bắt buộc phải làm cho các nhà máy riêng của mình dùng một lần, vì nó tạo ra fiddles và giữ tài liệu tham khảo cho họ trong suốt cuộc đời của họ. Nhưng điều đó sẽ gây ra vấn đề cho các khách hàng cho rằng họ sở hữu các câu đố và do đó nên vứt bỏ chúng.
là vấn đề thực sự mà tôi gọi là nhà máy FiddleFactory
thay vì, nói, FiddlePool
, và "sáng tạo" Phương pháp CreateFiddle
thay vì GetFiddle
? Như thế này:
public class FiddlePool : IDisposable
{
private Dictionary<SomethingThatDifferentiatesFiddles, DisposableFiddle> fiddles = new ...;
public DisposableFiddle GetFiddle(SomethingThatDifferentiatesFiddles s)
{
// returns an existing fiddle if a corresponding s is found,
// or a newly created fiddle, after adding it to the dictionary,
// if no corresponding s is found.
}
// Implements IDisposable
}
Sau đó, nó rõ ràng hơn với khách hàng rằng nó sẽ không sở hữu thẻ trả về và đó là trách nhiệm của hồ bơi để vứt bỏ các câu đố.
Hoặc điều này chỉ có thể dễ dàng được giải quyết bằng tài liệu?
Có cách nào thoát khỏi tình huống khó xử không? Thậm chí có một tình trạng tiến thoái lưỡng nan? :-)
Cảm ơn, người đầu tiên tuân theo Luật Demeter tốt hơn và thứ hai phù hợp hơn trong thiết kế tổng thể của tôi. Hmmm ... –
Tôi sẽ đặt hai xu của tôi vào cho phương pháp đầu tiên - Tôi đã nhìn thấy một quá nhiều người cố gắng để viết hồ bơi SqlConnnection của riêng mình! (Không hẳn, nhưng tôi * phải * giải thích tại sao nó không cần thiết.) –