标签: factory-pattern

Symfony 工厂:注入依赖项、自动装配和绑定参数

Symfony 文档没有给出Symfony 中工厂使用的完整示例。

就我而言,我有许多不同的服务,可以生成不同的水果 API:

  • BananaApi服务
  • 苹果API服务
  • PearApi服务
  • ..

每个服务都有自己的依赖项,依赖项是一些绑定参数:

services:
    _defaults:
        autowire: true
        bind:
            $guzzleClientBanana: '@eight_points_guzzle.client.banana'
            $guzzleClientApple: '@eight_points_guzzle.client.apple'
            ...
Run Code Online (Sandbox Code Playgroud)

服务举例:

# BananaApiService.php

class BananaApiService extends DefaultEndpointService
{
    protected $guzzleClientBanana;

    public function __construct(GuzzleClient $guzzleClientBanana)
    {
        $this->guzzleClientBanana = $guzzleClientBanana;
    }

    public function handleRequest(ApiRequest $apiRequest)
    {
    ...
    }
}
Run Code Online (Sandbox Code Playgroud)

目前我没有使用工厂模式,而是将所有服务传递给管理器的构造函数,这太脏了并且不符合最佳实践:

# ApisManagerService

class ApisManagerService
{
    protected $BananaApiService;
    protected $AppleApiService;
    protected $PearApiService;

    public function __construct(BananaApiService $BananaApiService, 
                                AppleApiService $AppleApiService, 
                                PearApiService $PearApiService)
    {
        $this->BananaApiService = $BananaApiService;
        //...
    }

    public function requestDispatcher(ShoppingList $shoppingList): void …
Run Code Online (Sandbox Code Playgroud)

php factory dependency-injection factory-pattern symfony

3
推荐指数
1
解决办法
3442
查看次数

如何使用工厂构造函数在 Dart 中实现单例模式?

我正在尝试在数据库帮助程序类中实现单例模式,但是,我似乎无法理解工厂构造函数的用途以及是否有使用它的替代方法。

class DbHelper {

         final String tblName ='';
         final String clmnName ='';
         final String clmnPass='';

         DbHelper._constr();
         static final DbHelper _db = new DbHelper._constr();

         factory DbHelper(){ return _db;}  

         Database _mydb;
         Future<Database> get mydb async{

         initDb() {
          if(_mydb != null)
          {
              return _mydb;
          }
          _mydb = await  initDb();
          return _mydb;
         }
Run Code Online (Sandbox Code Playgroud)

singleton constructor factory factory-pattern dart

3
推荐指数
1
解决办法
3466
查看次数

抽象工厂问题

我试图了解抽象工厂的设计模式.我遇到了很多麻烦.我试图使用以下示例来开发UML类图:

汽车设计师可以设计许多不同类型的汽车.汽车可以有两扇门,也可以有四扇门.汽车可以是四轮驱动,也可以是两轮驱动.汽车由不同的部件组成:车轮,车门,发动机,变速箱等.每个部件都有不同的操作:例如,变速器可以有first_gear(),second_gear(),third_gear(),fourth_gear(),reverse() ,中立().

汽车零件(如上所列)可在家庭中使用:本田,吉普,福特等.

使用抽象工厂设计方法,我需要开发一个软件系统,以便系统可以轻松地将汽车从一个家庭转换到另一个家庭.

这是我到目前为止所想的:拥有一个工厂和多个抽象工厂.因此,抽象工厂创建模型,而工厂创建零件......

有人可以帮忙吗?谢谢..

uml design-patterns class-diagram factory-pattern

2
推荐指数
1
解决办法
449
查看次数

为什么有些类会限制直接实例化?

我遇到过各种不允许直接创建实例的类.相反,我们必须从其他类的静态方法创建它们的实例,或者它拥有静态方法.例如:

B b = A.getB();
Run Code Online (Sandbox Code Playgroud)

要么

B b = B.getInstance();
Run Code Online (Sandbox Code Playgroud)

这背后是什么原因?

为什么他们不允许直接创建实例,如:

B b = new B();
Run Code Online (Sandbox Code Playgroud)

java instantiation factory-pattern

2
推荐指数
1
解决办法
1153
查看次数

什么时候工厂合适?

取自维基百科:

在面向对象的计算机编程中,工厂是用于创建其他对象的对象.它是构造函数的抽象,可用于实现各种分配方案.

有人可以解释什么时候需要工厂级或有益吗?

我目前正在开发一个项目,我有一个类,并使用构造函数初始化一个对象(呃!),但它可能会失败,根本不会初始化.我有一个Success属性来检查它是否正确创建.这是一个应该实施工厂类的好例子吗?这样Create()方法可以返回null,我可以摆脱Success属性.我有正确的想法吗?

design-patterns factory-pattern

2
推荐指数
1
解决办法
252
查看次数

工厂设计模式:工厂可以保存实例吗?

我需要创建同一个类的多个实例,并决定使用工厂模式.我们需要为工厂创建的实例提供查询功能.

因此,按照工厂模式的标准,工厂可以保留它创建的对象吗?或者我需要创建另一个允许查询这些实例的组件?

design-patterns factory-pattern

2
推荐指数
1
解决办法
336
查看次数

Ninject MVC 3 - 将依赖项注入模型和控制器

当我们将依赖项注入控制器和模型时,我并不完全理解幕后发生的事情.

我有以下控制器:

    public class TypeController : CommonController
    {
        private ILookUpService lookUpService;

        public TypeController(ILookUpService lookUpService)
        {
            this.lookUpService = lookUpService;    
        }   

    }
Run Code Online (Sandbox Code Playgroud)

应用程序启动时,查找服务已经可用.所以我想在幕后的某个地方我们有代码就行了

TypeController controller = new TypeController(service);
Run Code Online (Sandbox Code Playgroud)

或与工厂有关(我需要阅读).

当将服务注入到视图模型中时,它不起作用,因为我需要在不将接口传递给我的服务的情况下调用空构造函数.

那么幕后发生了什么?如何将服务注入视图模型?我想我错过了一些真正的根本性东西,它阻止我做我需要的东西.

我已将FactoryPattern包含在标签中,因为我的直觉告诉我它与我的问题有关.

谢谢

dependency-injection ninject factory-pattern asp.net-mvc-3

2
推荐指数
1
解决办法
653
查看次数

工厂模式返回一个列表

在我的程序中,我同时在多个服务器上上传一个文件,如谷歌驱动器,保管箱等.我正在使用适配器设计模式来调整每个服务器api,因此每个服务器具体类实现一个FileServer接口,最后我有一个FileServer对象列表.我的问题:由于我的程序将来必须支持新的服务器,封装所有服务器对象实例化的最佳方法是什么(我的意思是,"... =新..."部分)?我们想到的是工厂模式,但是在工厂方法中返回列表是否正确?谢谢.

java design-patterns factory-pattern pluggable

2
推荐指数
1
解决办法
2931
查看次数

工厂模式使用反射 - 使用与每个类关联的静态键进行类注册

在研究某些模式时,我遇到了工厂模式,以创建(未知)类的实例.这让我感兴趣,因此我想构建一个可以动态增强的程序.所以我在一个程序集中有一些基本功能,在不同程序集中有实际的工作程序.我从应用程序中获得的唯一提示是操作名称.现在我想创建一个依赖于该操作的新工作者.因为我不知道工人的实际实施,所以我选择了这种模式.

好的,更多细节:

我有一个接口IWorker,我的所有流程都实现了.Singleton WorkerFactory允许我创建在与当前路径相同的路径中的任何程序集中实现的任何worker的新实例.为此,我CreateWorker在我的接口中添加了一个接受字符串数组的方法(已经传递varargs给控制台应用程序).

在能够创建任何工人的任何实例之前,我必须将任何类注册到工厂.不幸的是在C#这是不可能静态地插入这样的行为变成了工人类的任何静态情况下,因为这个范围内的代码才会执行上课的时候以任何方式访问(通过实例,或通过访问任何的吧它的静态成员,请参阅静态构造函数).因此,我通过使用当前正在执行的程序集的路径反映所有程序集中找到的所有类型来实现此目的.现在我可以检查当前类型是否正在实现接口,如果是,则可以将类型添加到包含操作名称(键)和工作者(值)的工厂的注册图中System.Type(参见使用反射的工厂模式).问题是:如何获取此类型引用的操作的实际名称.

我认为有两种选择:

  1. 我向每个存储操作名称的worker-class添加一个静态属性.因此,我可以通过在获得的类型上反映此属性来引用该操作.
  2. 为名称添加非静态属性,并在注册时创建实际worker类的虚拟实例.

前者选项的缺点是,我不能保证所有的工人居然有这样的静态属性实现的(因此它无法静态成员添加到IWorker接口),后者每一个类必须有一个空的缺点构造函数,以便构建从中获取操作名称的虚拟实例.然而,这个构造函数可以公开访问,而不包含任何初始化代码.

说完所有这些问题都是关于使用反射的工厂模式的最佳或至少更好的实践.我想我更喜欢第一种选择,但也许我也错过了这种方法的更好的解决方案.

因此这个帖子已经很长了我不想在这里发布任何代码,但是如果你需要的话请告诉我.

c# reflection factory-pattern

2
推荐指数
1
解决办法
2259
查看次数

为什么在简单依赖注入足够时使用工厂模式

我期待这个例子来了解工厂模式的使用.

我真的很喜欢这个领域,所以原谅我的愚蠢问题.

我的问题是我没有看到工厂模式的使用,它返回了我们可以在需要使用它时直接注入它的接口.

在上面的例子中,我会做这样的事情:

public class Program
{
    // register the interfaces with DI container in a separate config class (Unity in this case)
    private readonly IShippingStrategy _shippingStrategy;

    public Program(IShippingStrategy shippingStrategy)
    {
        _shippingStrategy= shippingStrategy;
    }

    public int DoTheWork(Order order)
    {
        // assign properties just as an example
        order.ShippingMethod = "Fedex";
        order.OrderTotal = 90;
        order.OrderWeight = 12;
        order.OrderZipCode = 98109;

        int shippingCost = _shippingStrategy.CalculateShippingCost(order);

        return shippingCost;
    }
}
Run Code Online (Sandbox Code Playgroud)

而不是注射工厂:

public class Program
{
    // register the interfaces with DI …
Run Code Online (Sandbox Code Playgroud)

c# design-patterns dependency-injection factory-pattern

2
推荐指数
1
解决办法
75
查看次数