此标记有时用于引用工厂方法模式([factory-method]),有时用于引用抽象工厂模式([abstract-factory])。请使用这些标签中的任何一个而不是此标签。
在我的应用程序中,我希望有一个 EventPersister 特征,它定义持久事件的抽象,然后有各种实现,例如,将事件持久保存在内存中、文件中
我想要构造相似的对象,但并不总是具有相同的参数,我应该使用什么创建模式
所以我有多个相关但内容不同的课程。我尝试过创建一家工厂,但我无法完全理解这一切。我可能使用了错误的模式或做了一些...
我想构造相似但不总是具有相同参数的 JavaScript 对象,我应该使用什么创建模式
所以我有多个相关但内容不同的课程。我尝试过创建一家工厂,但我无法完全理解这一切。我可能使用了错误的模式或做了一些...
基于这个主题,我想知道是否可以有一个工厂类来提供容器类型,而不需要定义容器元素的类型。 像这样的东西: 模板<
我有一个工厂方法来实例化一个类。有没有办法阻止此类直接实例化? 我看到的唯一选择是使用传递到 __construct() 的参数,但这不是
我有一个工厂,其中包含一个映射,其中对象名称作为键,函数指针作为值 模板 静态 T* makeObj() { 返回新的T(); } 使用 createFunction = ...
我有一个工厂,其中包含一个映射,其中对象名称作为键,函数指针作为值 模板 静态 T* makeObj() { 返回新的T(); } 使用 createFunction = ...
我正在学习工厂方法设计模式,但我很难准确理解它试图解决的问题以及如何解决。 我们先来介绍一下维基百科使用的例子...
Refactoring Guru 中工厂模式的 Python 版本是: from __future__ 导入注释 从 abc 导入 ABC,抽象方法 类创建者(ABC): @抽象方法 def 工厂_遇见...
我试图了解如何使用工厂模式和依赖注入(Microsoft.Extensions)在运行时使用一些输入配置创建服务实例(例如,ITransport)。
我正在使用一种模式,其中实现接口的具体 ViewModel 被传递到存储库,然后存储库填充 ViewModel 对象,但仅使用该接口。这有点
我正在尝试使用 C++ 模板编写抽象工厂。因为在遇到麻烦之前我从来没有做过这样的事情。我写的代码,你可以自己验证一下,是wr...
在Nestjs中,我有一个模块,它使用useFactory基于configValue动态创建类 该模块中没有专门的服务,而是返回一个依赖于配置的服务,
我理解工厂方法是一种类方法,它利用 self 关键字并实例化它自己的类的对象。我不明白这有什么用处或者它如何扩展
工厂设计模式是否违反了C#中实体原则的依赖倒置原则? [重复]
根据定义,依赖注入促进了松散耦合、可维护和可测试的代码,并且使用接口和构造函数注入,我们可以获得实现接口的类的对象...
根据定义,依赖注入促进了松散耦合、可维护和可测试的代码,并且使用接口和构造函数注入,我们可以获得实现接口的类的对象...
工厂方法:为什么不在工厂中为每种类型创建一个 CreateMethod?
所以我正在阅读《设计模式》一书,以查找有关工厂模式的一些详细信息。我正在阅读有关实现的两种主要变体: 使用抽象工厂和具体工厂...
所以我试图重写 __new__ 并让它作为工厂存在来创建 派生实例。在阅读了一些关于 SO 的内容之后,我的印象是我应该在派生的 ins 上调用 __new__ ...
我在 DI 容器上注册了同一接口的六个实现,如下所示: services.AddScoped(); 服务.AddScoped 我在 DI 容器上注册了同一接口的六个实现,如下所示: services.AddScoped<IProductService, ProductService1>(); services.AddScoped<IProductService, ProductService2>(); // ... services.AddScoped<IProductService, ProductService6>(); 使用这些服务的控制器有一个参数productName,我用它来选择我想要的服务。为了分离关注点,我实现了一个工厂类,它接受该字符串并从服务提供者检索所请求的服务。像这样的东西: public string ProductController(string productName) { var myService = _productFactory.GetProductService(productName); // ... do other stuff } 这就是我对工厂课程的想法 public IProductService GetProductService(string productName) { switch (productName.ToLower()) { case "product1": return _serviceProvider.GetRequiredService<ProductService1>(); case "product2": return _serviceProvider.GetRequiredService<ProductService2>(); // ... } } 但是,这会返回错误,因为它找不到 ProductService1 类型的服务,等等。根据我对这些方法如何工作的理解,它只找到类型IProductService。 如何根据实现来搜索所需的服务?我可以按名称搜索服务吗?或者有没有办法将字符串链接到 DI 容器上的实现?如果我无法告诉工厂类应该在每种情况下检索哪个实现,我不知道工厂类将如何工作。 您实际上并未将任何内容注册为 ProductService1、2 或 3 等。您将它们全部注册为 IProductService。您可以将它们注册为您尝试解析它们的类型,如下所示: services.AddScoped<ProductService1>(); 这是一个完整的工作示例: using Microsoft.Extensions.DependencyInjection; var factory = new ProductServiceFactory(); var service = factory.GetProductService("product1"); Console.WriteLine(service.ToString()); class ProductServiceFactory { readonly IServiceProvider _serviceProvider; public ProductServiceFactory() { var services = new ServiceCollection(); services.AddScoped<ProductService1>(); services.AddScoped<ProductService2>(); services.AddScoped<ProductService3>(); _serviceProvider = services.BuildServiceProvider(); } public IProductService GetProductService(string productName) { switch (productName.ToLower()) { case "product1": return _serviceProvider.GetRequiredService<ProductService1>(); case "product2": return _serviceProvider.GetRequiredService<ProductService2>(); case "product3": return _serviceProvider.GetRequiredService<ProductService3>(); default: throw new ArgumentException(productName); } } } interface IProductService { } class ProductService1 : IProductService { } class ProductService2 : IProductService { } class ProductService3 : IProductService { } 请注意,这实际上可能会更干净一些。如果您使用 Scrutor 进行注册,则无需注册每个单独的类型,因此下次添加产品服务时它将自动注册。 var services = new ServiceCollection(); services.Scan(s => s.FromAssemblyOf<IProductService>() .AddClasses(c => c.AssignableTo<IProductService>()) .AsSelf() ); // no longer needed to do individual registrations // Scrutor will pick up these and any new IProductService implementations! //services.AddScoped<ProductService1>(); //services.AddScoped<ProductService2>(); //services.AddScoped<ProductService3>(); _serviceProvider = services.BuildServiceProvider(); 有一些方法可以清理工厂并进行制造,这样您就不必不断添加案例陈述。例如,假设您的 IProductServices 必须声明它们支持哪种产品,我们可以这样获取它们: using Microsoft.Extensions.DependencyInjection; var factory = new ProductServiceFactory(); var service = factory.GetProductService("product1"); Console.WriteLine(service.ToString()); class ProductServiceFactory { IEnumerable<IProductService> _productServices; public ProductServiceFactory() { var services = new ServiceCollection(); services.Scan(s => s.FromAssemblyOf<IProductService>() .AddClasses(c => c.AssignableTo<IProductService>()) .AsImplementedInterfaces() ); var serviceProvider = services.BuildServiceProvider(); _productServices = serviceProvider.GetServices<IProductService>(); } public IProductService GetProductService(string productName) { var productService = _productServices.SingleOrDefault(p => productName.Equals(p.ProductName, StringComparison.InvariantCultureIgnoreCase)); if (productService is null) { throw new ArgumentException(productName); } return productService; } } interface IProductService { string ProductName { get; } } class ProductService1 : IProductService { public string ProductName => "product1"; } class ProductService2 : IProductService { public string ProductName => "product2"; } class ProductService3 : IProductService { public string ProductName => "product3"; } 还有一些其他技术可能效率更高或更低一些,或者可以更好地处理你的范围界定需求,但我想说这已经是一个很大的改进了。
我正在尝试构建一个 Flask 应用程序并使用 mod_wsgi 服务器进行托管。我使用工厂函数来创建 Flask 应用程序,但我观察到 mod-wsgi 在同一个