客户端如何访问工厂模式中的具体产品

How the client can have access to the concreteproducts in Factory pattern

在 c# 中实现工厂方法时,我有几个具体的产品,比如 ConcretProductAConcretProductB,其中每个 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();