5

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

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

这个对吗?如何确保仅通过工厂创建具体类?

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();

        }
4

2 回答 2

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";
  }
}
于 2012-05-08T15:07:11.040 回答
2

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

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

  1. 绕过这个因素并创建自己的数据源的后果是什么?没什么不好?性能较差?重大安全违规?如果他们只是在踢自己的脚或没有受伤,也许你不需要费心去阻止他们。
  2. 阻止他们有多难?您是否需要阻止他们使用反射来访问底层类?使用接口层就足够了吗?
  3. 您的用户的可信度如何?它只是供您自己使用还是供您自己的团队使用的内部应用程序?它是否被运送给成千上万的其他人?小型内部使用应用程序可能不会打扰,大型应用程序需要假设存在真正恶意或无知的用户,并且您暴露的内容将非常重要。随着用户群的增长,总体上提高可用性也很重要。
于 2012-05-08T15:07:13.570 回答