工厂模式理解

时间:2012-05-08 14:53:00

标签: c#

我已经实现了如下工厂模式。

但是,由于各个类都是公共的,所以没有什么能阻止某人直接实例化它们。

这是对的吗?如何确保仅通过Factory创建具体类?

namespace MRS.Framework
{
    public  abstract class DataSource
    {
        public override string ToString()
        {
            return "DataSource";
        }
    }

    public class XMLDataSource : DataSource
    {

    }

    public class SqlDataSource : DataSource
    {

    }

    public class CSVDataSource : DataSource
    {
        public int MyProperty { get; set; }


        public override string ToString()
        {
            return "CSVDataSource";
        }
    }
}

工厂实施

namespace MRS.Framework
{
    public abstract class DataSourceFactory
    {
        public abstract DataSource CreateDataSource(DataSourceType datasourcetype);
    }

    public class CSVDataSourceFactory : DataSourceFactory
    {
        public CSVDataSourceFactory()
        {

        }
        public override DataSource CreateDataSource(DataSourceType datasourcetype)
        {
            return new CSVDataSource();
        }
    }


    public class XMLDataSourceFactory : DataSourceFactory
    {
        public override DataSource CreateDataSource(DataSourceType datasourcetype)
        {
            return new XMLDataSource();
        }
    }

    public class SqlDataSourceFactory : DataSourceFactory
    {
        public override DataSource CreateDataSource(DataSourceType datasourcetype)
        {
            return new SqlDataSource();
        }
    }

}

主要

 static void Main(string[] args)
        {
            DataSourceFactory datasourcefactory = new CSVDataSourceFactory();
            CSVDataSource ds = (CSVDataSource)datasourcefactory.CreateDataSource(DataSourceType.CSVDataSource);
            CSVDataSource myds = new CSVDataSource();
            Console.WriteLine(ds.ToString());
            Console.WriteLine(myds.ToString());
            Console.ReadLine();

        }

2 个答案:

答案 0 :(得分:6)

是的,你的直觉是正确的;如果您想限制CSVDataSourceFactory课程的构建,那么您的访问修饰符就会出错。

但是,它不是您需要修复的类的访问修饰符,它是构造函数的访问修饰符。您应该标记默认构造函数internal,以便只有程序集中的其他类可以构造它们。当然,您必须在该程序集中强制执行您自己的规则,但由于您可以完全控制该代码,因此它不应成为问题。

public class XMLDataSource : DataSource
{
  internal XMLDataSource() { }
}

public class SqlDataSource : DataSource
{
  internal SqlDataSource() { }
}

public class CSVDataSource : DataSource
{
  public int MyProperty { get; set; }

  internal CSVDataSource() { }

  public override string ToString()
  {
      return "CSVDataSource";
  }
}

答案 1 :(得分:2)

如果您想知道如何阻止人们创建数据源的实例,您可以通过接口来完成。使用您希望它公开的所有方法为每个数据源创建一个接口。使类本身内部或工厂的私有内部类(内部通常是合适的)和接口public。

如果问题不是如何阻止人们创建实例,但如果你应该这样做,这更像是一个主观的答案。有几点需要考虑:

  1. 有人绕过因素并创建自己的数据源会有什么后果?没什么不好?表现较差?重大安全违规?如果他们只是在脚下射击或者什么都不做,也许你不需要费心去阻止他们。
  2. 阻止他们有多难?您是否需要阻止它们使用反射来访问基础类?使用的界面层是否足够?
  3. 您的用户如何信任?它只是一个供您自己使用或在您自己的团队中使用的内部应用程序吗?它被运送给成千上万的人吗?一个小的内部使用应用程序可能不会打扰,一个大规模的应用程序需要假设有真正的恶意用户或无知用户,你揭露的内容将显着重要。随着用户群的增长,提高可用性也很重要。