c#实现相同接口的类的工厂

时间:2015-05-11 15:51:05

标签: c# factory-pattern

我想创建一个使用文本参数创建对象的工厂。 需要创建的类不是从单个基类派生的,而是实现相同的接口。

public class Square: IPrintable
{
...
}

public class Triangle: IPrintable
{
...
}

interface IPrintable
{
   void print();
}

我希望能够以下列方式创建对象:

PrinterSettings settings = new PrinterSettings("something");
ShapeFactory.Instance().Create("Triangle", settings);

我想过创建一个包含地图的工厂,以便按以下方式处理字符串ID:

public class ShapeFactory
{
    static ShapeFactory singleton;
    Dictionary<string, XXX > map;

    private ShapeFactory(){};

    public static ShapeFactory Instance()
    {
       ...
       return singleton;
    }

    public void register(string ID, XXX obj);

    public IPrintable Create(string ID, PrinterSettings obj);
}

public SquareFactory
{...}

public TriangleFactory
{...}

我正在努力寻找哪些类作为我的地图的值来使它全部工作。如果上面有一些严重的设计问题,请告诉我。

1 个答案:

答案 0 :(得分:0)

它认为代码气味将类型信息作为字符串传递为强类型语言,如C#。通常,你会看到这个写成:

ShapeFactory.Instance().Create(typeof(Triangle), settings);

或只是

ShapeFactory.Instance().Create<Triangle>(settings);

您要求的内容可以完成,但最好是传递类型信息,而不是在实例化对象时查找类型。如果您需要从类名创建一个类型,请查看Activator.CreateInstance以了解如何执行此操作。解析类型可能并非易事,因此您也可能需要阅读Reflection,以了解框架如何完成类型解析。