客户端如何访问工厂模式中的具体产品
How the client can have access to the concreteproducts in Factory pattern
在 c# 中实现工厂方法时,我有几个具体的产品,比如 ConcretProductA
和 ConcretProductB
,其中每个 ConcretProduct
都有一个 public 字符串名称。我面临的问题是我需要创建所有 ConcretProducts
' 名称的列表。例如,此列表将用于使用户能够在运行时 select 组合框中的一个产品。
所以我需要能够读取所有 ConcretProducts
' 名称,而无需为所有可用 concretProducts
实例化实例,读取名称(我很可能必须将其设为静态)和例如,将其存储在枚举中。如果不是直接界面能帮我吗?
这行得通吗?或者有更好的解决方案?
我可以想到 3 个解决方案:
a) 我会尝试找到一种方法将产品名称存储在单独的列表中。
b) 一种可能性是使用反射。如果您的所有产品都派生自一个基类型,您可以从程序集中加载所有派生类型并将名称传播到 UI。
c) 您也可以将属性放在 类 上。这样,您可以将人类可读的名称放在 UI 上而无需转换它们。
解决方案 b 和 c 的问题在于没有关注点分离,尤其是 c,因为您的域层必须知道产品的显示名称。本地化也可能变得非常困难
您可以使用反射来做到这一点:
public interface IMarkerConcretProducts
{
}
internal class ConcretProductA : IMarkerConcretProducts
{
}
public class ConcretProductB : IMarkerConcretProducts
{
}
然后得到类
的名字
var products = AppDomain.CurrentDomain.GetAssemblies().SelectMany(x => x.GetTypes())
.Where(x => typeof(IMarkerConcretProducts).IsAssignableFrom(x) && !x.IsInterface && !x.IsAbstract)
.Select(x => x.Name).ToList();
在 c# 中实现工厂方法时,我有几个具体的产品,比如 ConcretProductA
和 ConcretProductB
,其中每个 ConcretProduct
都有一个 public 字符串名称。我面临的问题是我需要创建所有 ConcretProducts
' 名称的列表。例如,此列表将用于使用户能够在运行时 select 组合框中的一个产品。
所以我需要能够读取所有 ConcretProducts
' 名称,而无需为所有可用 concretProducts
实例化实例,读取名称(我很可能必须将其设为静态)和例如,将其存储在枚举中。如果不是直接界面能帮我吗?
这行得通吗?或者有更好的解决方案?
我可以想到 3 个解决方案:
a) 我会尝试找到一种方法将产品名称存储在单独的列表中。
b) 一种可能性是使用反射。如果您的所有产品都派生自一个基类型,您可以从程序集中加载所有派生类型并将名称传播到 UI。
c) 您也可以将属性放在 类 上。这样,您可以将人类可读的名称放在 UI 上而无需转换它们。
解决方案 b 和 c 的问题在于没有关注点分离,尤其是 c,因为您的域层必须知道产品的显示名称。本地化也可能变得非常困难
您可以使用反射来做到这一点:
public interface IMarkerConcretProducts
{
}
internal class ConcretProductA : IMarkerConcretProducts
{
}
public class ConcretProductB : IMarkerConcretProducts
{
}
然后得到类
的名字var products = AppDomain.CurrentDomain.GetAssemblies().SelectMany(x => x.GetTypes())
.Where(x => typeof(IMarkerConcretProducts).IsAssignableFrom(x) && !x.IsInterface && !x.IsAbstract)
.Select(x => x.Name).ToList();