gpt4 book ai didi

c# - 工厂模式可以这样使用吗?

转载 作者:行者123 更新时间:2023-11-30 13:38:55 25 4
gpt4 key购买 nike

在我的程序中,一些对象需要其他对象(依赖),我使用工厂作为我的创建模式。

现在,我该如何解决一个简单的依赖问题?

这是我为解决问题所做的工作的示例。我想知道将需要的对象发送到 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();
}
}
}

最佳答案

它是功能性的,但是,如果添加更多类型,它可能会变得很麻烦。
根据我个人对简单工厂的偏好,实现将是:

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");
}
}
}

这种方法的一个很好的副作用是,只需要做一点工作就可以让这个东西配置驱动而不是硬编码。

关于c# - 工厂模式可以这样使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14099450/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com