gpt4 book ai didi

c# - 工厂模式理解

转载 作者:太空狗 更新时间:2023-10-29 22:53:26 29 4
gpt4 key购买 nike

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

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

这是正确的吗?如何确保具体类仅通过工厂创建?

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

}

最佳答案

是的,您的直觉是正确的;如果您想限制 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";
}
}

关于c# - 工厂模式理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10501058/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com