在我的程序中,一些对象需要其他对象(依赖项),并且我使用Factory作为我的创建模式。
现在,我如何解决一个简单的依赖问题?
这是我为解决问题所做的一个例子。我想知道将所需对象发送到Create方法是不是非常错误。
//AbstractBackground
// - SpecialBackground
// - ImageBackground
// - NormalBackground
class Screen{
List<AbstractBackground> list;
Cursor cursor;
ContentManager content;
public void load(string[] backgroundTypes){
//is this okay? --------------->
AbstractBackground background = BackgroundFactory.Create(backgroundTypes[0], cursor, content);
list.add(background);
}
}
class BackgroundFactory{
static public AbstractBackground Create(string type, Cursor cursor, ContentManager content){
if( type.Equals("special") ){
return new SpecialBackground(cursor, content);
}
if( type.Equals("image") ){
return new ImageBackground(content);
}
if( type.Equals("normal") ){
return new NormalBackground();
}
}
}
答案 0 :(得分:5)
它是功能性的,但是,如果添加更多类型,它可能会变得很麻烦 根据我个人对简易工厂的偏好,实施将是:
enum BackgroundFactoryType
{
Special,
Image,
Normal,
}
static class BackgroundFactory{
static Dictionary<BackgroundFactoryType, Func<Cursor, ContentManager, AbstractBackground>> constructors;
static BackgroundFactory()
{
//initialize the constructor funcs
constructors = new Dictionary<BackgroundFactoryType, Func<Cursor, ContentManager, AbstractBackground>>();
constructors.Add(BackgroundFactoryType.Special, (cursor, content) => new SpecialBackground(cursor, content));
constructors.Add(BackgroundFactoryType.Image, (_, content) => new ImageBackground(content));
constructors.Add(BackgroundFactoryType.Normal, (_, __) => new NormalBackground());
}
static public AbstractBackground Create(BackgroundFactoryType type, Cursor cursor, ContentManager content)
{
if (!constructors.ContainsKey(type))
throw new ArgumentException("the type is bogus");
return constructors[type](cursor, content);
}
}
或者您可以这样做:
static class BackgroundFactory{
static public AbstractBackground Create(BackgroundFactoryType type, Cursor cursor, ContentManager content)
{
switch (type)
{
case BackgroundFactoryType.Special:
return new SpecialBackground(cursor, content);
case BackgroundFactoryType.Image:
return new ImageBackground(content);
case BackgroundFactoryType.Normal:
return new NormalBackground();
default:
throw new ArgumentException("the type is bogus");
}
}
}
这种方法的一个不错的副作用是,只需要一点工作就可以使这个配置驱动而不是硬编码。
答案 1 :(得分:4)
简单的回答,看起来不错。如果您想到这一点,那么您将通过create方法将对象注入构造函数中。这种技术没有错,我建议这样做。
稍后,如果您需要更改实现,可以根据需要创建其他创建方法,而不会破坏任何内容。
答案 2 :(得分:1)
你的代码中没有任何丑陋的东西,除非你的依赖树增长你创建的工厂方法将变得复杂。
为了使具有各种明确依赖关系的类型分解,您最好选择基于IoC
的工厂。通过在容器中注册依赖项,您将拥有具有所需依赖项的自动注入构造函数。