我已经实现了如下工厂模式。
但是,由于各个类都是公共的,所以没有什么能阻止某人直接实例化它们。
这是对的吗?如何确保仅通过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();
}
答案 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。
如果问题不是如何阻止人们创建实例,但如果你应该这样做,这更像是一个主观的答案。有几点需要考虑: