如何更改此代码以返回多个不同的项目

时间:2013-11-22 16:04:44

标签: c# oop factory-pattern

这个工厂的例子; http://www.dotnetperls.com/factory 返回1件事。如何更改它以返回这样的内容;

string device = "";
string deviceTypeID = "";
int deviceTypeCode = 0;
bool true

作为一个例子,在每个具体的课程中,我会看起来像这样;

string device = "bracelet";
string deviceTypeID = "male";
int deviceTypeCode = 0;
bool true

或者,对于另一个具体的类;

string device = "ring";
string deviceTypeID = "female";
int deviceTypeCode = 8;
bool false

我想我需要在每个具体的类中创建一个对象,但由于我对C#很陌生,这是我的理解。

谢谢!

3 个答案:

答案 0 :(得分:2)

将它们组合在一起class

sealed class MyClass 
{
    public MyClass(string device, string deviceTypeId, int deviceTypeCode, bool someBool)
    {
        this.Device = device;
        this.DeviceTypeId = deviceTypeId;
        this.DeviceTypeCode = deviceTypeCode;
        this.SomeBool = someBool
    }

    string Device { get; private set; }
    string DeviceTypeId { get; private set; }
    int DeviceTypeCode { get; private set; }
    bool SomeBool { get; private set; }
}

然后将其返回factory

return new MyClass("bracelet", "male", 0, false);

您的课程实施可能会有所不同,我已在此处实施,以便您只能从中进行阅读(制作后无法更改)。

答案 1 :(得分:2)

定义一个新类(或结构,如果您要创建大量这些类):

public class Container
{
  public string Device;
  public string DeviceTypeID;
  public int DeviceTypeCode;
  public bool MyBool;
}

然后让你的工厂创建这个类并将其返回:

return new Container { Device = "bracelet", DeviceTypeID = "male" };

答案 2 :(得分:0)

我想在Adam Kewley的回答中添加一些内容。如果您的工厂要创建并返回许多项目,那么设置静态字典并通过其键引用它们可能会很有用。在现实世界中,您可能将“设备”存储在数据库中并由程序缓存,但这可能是您探索实施工厂模式细节的有用方法。

    class ItemFactory
    {
        private static readonly Dictionary<string, MyClass> knownItems = new Dictionary<string, MyClass>
        {
            {"bracelet", new MyClass("bracelet", "male", 0, true)},
            {"ring", new MyClass("ring","female",8,false)}
        };

        public MyClass createItemByType(string itemType)
        {
            if (knownItems.ContainsKey(itemType))
                return (knownItems[itemType]); 
            // default behavior if an item isn't found.
            // maybe throw an exception here, depending on your needs. 
            return new MyClass(); // unknown item
    }
}