标签: factory-pattern

如何实现通用的RepositoryFactory?

我正在尝试实现Generic Repository.这是我到目前为止所得到的......

public interface IRepositoryFactory
{
    IRepository<T> RepositoryOf<T>() where T : class;
}

public class EntityFrameworkRepositoryFactory : IRepositoryFactory
{
    private readonly IWindsorContainer _container;

    public EntityFrameworkRepositoryFactory(IWindsorContainer container)
    {
        _container = container;
    }

    public IRepository<T> RepositoryOf<T>() where T : class
    {
        var repository = _container.Resolve<IRepository<T>>();
        return repository;
    }
}
Run Code Online (Sandbox Code Playgroud)

RepositoryFactory由我的工作单元实现使用

public interface IUnitOfWork : IDisposable
{
    IRepository<T> RepositoryOf<T>() where T : class;
    void Commit();
}
Run Code Online (Sandbox Code Playgroud)

无论如何,我想问的问题是,RepositoryFactory实现依赖于IWindsorContainer是否正确?

我需要一种方法来询问任何类型的IRepository,所以我的安装程序代码执行此操作...

// Windsor Container
container.Register(
    Component.For<IWindsorContainer>()
        .Named("Container")
        .Instance(container)
    );
Run Code Online (Sandbox Code Playgroud)

这似乎与IoC的整个概念背道而驰,但随后可能要求存储库的整个想法无论如何都会这样做.

编辑(回复miensol的回答)

我已经使用Windsor在我的安装程序中使用以下代码为我创建存储库...

// Generic …
Run Code Online (Sandbox Code Playgroud)

c# design-patterns repository-pattern factory-pattern entity-framework-4

8
推荐指数
1
解决办法
2306
查看次数

Python,以正确的方式进行条件导入

现在我有一个叫A的班级.

我有一些像这样的代码..

from my.package.location.A import A

...


foo = A.doSomething(bar)
Run Code Online (Sandbox Code Playgroud)

这很棒.

但是现在我有一个名为A的新版A,但是在另一个包中,但我只想在某个场景中使用其他A. 所以我可以这样做:

if(OldVersion):
    from my.package.location.A import A
else:
    from new.package.location.A import A

...

foo = A.doSomething(bar)
Run Code Online (Sandbox Code Playgroud)

这很好用.但它很难看.我怎么能做得更好?我真的想做这样的事情

from my.abstraction.layer.AFactory import AFactory
...
myA = AFactory.giveMeA() # this looks at "OldVersion" and gives me the correct A
foo = myA.doSomething(bar)
Run Code Online (Sandbox Code Playgroud)

有没有办法让我更轻松?没有工厂层?现在,这可以将我的类上的每个静态方法调用转换为2行.我总是可以在类中保留一个引用以减少影响,但我真的希望python有一个更简单的解决方案.

python import conditional factory-pattern

8
推荐指数
1
解决办法
1万
查看次数

带有swift的依赖注入,带有两个UIViewControllers的依赖图,没有公共父级

我们如何在不使用框架的情况下应用依赖注入,当我们有两个层次结构非常深的UIViewController并且它们都需要相同的依赖关系来保存状态时,那两个UIViewControllers它们没有共同的父代.

例:

VC1 - > VC2 - > VC3 - > VC4

VC5 - > VC6 - > VC7 - > VC8

让我们看看他们都需要VC4和VC8 UserService来保存当前用户.

请注意,我们要避免使用Singleton.

是否有一种优雅的方式来处理这种DI情况?

经过一番研究,我发现,有些提Abstract Factory,Context interfaces,Builder,strategy pattern

但我找不到如何在iOS上应用它的示例

dependency-injection inversion-of-control factory-pattern ios swift

8
推荐指数
1
解决办法
573
查看次数

为什么我得到"类型参数必须是无效的......"错误?

我将尝试缩短此代码示例:

public interface IThing
{
    //...  Stuff
}

public class Thing1 : IThing
{  
}

public class Thing2 : IThing
{  
}

public interface IThingView<out T>
{
    ICollection<T> ViewAll();
}

public class ThingView<T> : IThingView<T>
{
    ICollection<T> ViewAll() { return new List<T>(); }  //  There's a big operation here
}

public interface IThingViewerFactory
{
    public IThingView<IThing> Build(string Which);
}

public class ThingViewerFactory
{
    public IThingView<IThing> Build(string Which)
    {
        if(Which.Equals("Thing1") { return new (IThingView<IThing>)new ThingViewer<Thing1>();}
        else { return new (IThingView<IThing>)new ThingViewer<Thing2>();} …
Run Code Online (Sandbox Code Playgroud)

c# generics variant factory-pattern

7
推荐指数
2
解决办法
3418
查看次数

为什么Factory模式中的getInstance()方法是静态的?

在大多数工厂模式实现中,该getInstance方法通常声明为static.工厂模式的主要优点是隐藏实现细节,但为什么getInstance()方法需要是静态的?实例化一个新的工厂对象是一个坏习惯吗?

XYZFactory factory = new XYZFactory(); 
XYZObj obj = factory.getInstance(TYPE);
Run Code Online (Sandbox Code Playgroud)

VS

XYZObj obj = XYZFactory.getInstance(TYPE);
Run Code Online (Sandbox Code Playgroud)

java factory-pattern

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

工厂方法VS工厂对象

据我所知,工厂方法是简单工厂,工厂对象是抽象工厂?和:

- 工厂方法(简单工厂):

public class SimplePizzaFactory {
    public static final int CHEESE = 1;
    public static final int PEPPERONI = 2;
    public static final int VEGGIE = 3;

    public static Pizza createPizza(int type) {
        Pizza pizza = null;

        if (type == CHEESE) {
            pizza = new CheesePizza();
        } else if (type == PEPPERONI ) {
            pizza = new PepperoniPizza();
        } else if (type == VEGGIE ) {
            pizza = new VeggiePizza();
        }

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

工厂对象(抽象工厂):

我对吗?

工厂模式的实现有多少,它们的区别是什么?

java design-patterns factory factory-method factory-pattern

7
推荐指数
1
解决办法
2768
查看次数

如何在zend框架2中创建工厂?

在我的Module.php我有我不想移动他们的方法,factory class以便我不会混淆Module class:

public function getControllerConfig()
{
    return array(
        'factories' => array(
            'account-index' => function ($controllerManager) {
                $serviceManager = $controllerManager->getServiceLocator();
                $accountService = $serviceManager->get('account-service');

                return new Controller\IndexController($accountService);
            }
        )
    );
}

public function getServiceConfig()
{
    return array(
        'factories' => array(
            'account-service' => function ($serviceManages) {
                return new Service\Account;
            }
        )
    );
}
Run Code Online (Sandbox Code Playgroud)

现在我有:

我把它放在哪里factory class,也许放在一个Factory文件夹里?

有任何想法吗?

php class factory-pattern zend-framework2 servicemanager

7
推荐指数
1
解决办法
9437
查看次数

使用Symfony2实现Factory模式的最佳实践

我正在制作一个可以发送电子邮件或短信的信使,并且可以立即发送或稍后发送(信息保存在数据库中).我已经做了两个解决方案,但两个都不令我满意.

我正在将代码集中在一个Factory中,而Factory模式的代码非常简单:

class MessageFactory
{
     static public function get($type,$em)
     {
          $instance = null;
          switch ($type) {
              case 'email':
                    $instance = new EmailMessage($em);
                    break;
   ....
  return $instance;
}

class EmailMessage implements MessangerInterface
{
 ...
   public function send( $eMessage,array $receivers, $time=NULL)
   {

interface MessangerInterface
{
  public function send($message,array $receivers);
}
Run Code Online (Sandbox Code Playgroud)

第一个解决方案:只需调用普通的静态方法

$messanger = Factory\MessageFactory::get('email',$em);
$messanger->send($eMessage, array('tom'=>'tom@gmail.com'));
Run Code Online (Sandbox Code Playgroud)

这是一个糟糕的解决方案,因为我需要将Doctrine Manager作为参数传递给方法

第二种解决方案:将其用作Symfony 2服务

services:
my.messanger:
    class: Bundle\Factory\MessangerInterface
    factory_class: Bundle\Factory\MessageFactory
    factory_method: get
    arguments:
        messanger_type: %messanger.type%
Run Code Online (Sandbox Code Playgroud)

并且还将学说作为论据传递.但是使用这样的解决方案我不能在我的代码中选择messanger.type,它使用配置参数定义为emailsms; 我需要在代码中具有选择类型的能力.

另外我有一个问题,我需要在课堂上发送电子邮件或短信,这意味着我需要一个外部服务,得到这样的:

class EmailMessage …
Run Code Online (Sandbox Code Playgroud)

factory-pattern symfony

7
推荐指数
1
解决办法
1万
查看次数

什么是Ruby工厂方法?

我知道工厂方法是一个类方法,它利用self关键字并实例化它自己的类的对象.我不明白这是如何有用的,或者它如何扩展initialize方法的功能.

我正在创建一个创建命令行地址簿的项目,要求我在Person类上使用工厂模式,这样我就可以创建具有不同属性的Trainee或Instructor(子类).

ruby factory-method factory-pattern

7
推荐指数
1
解决办法
6882
查看次数

C++ 工厂模式实现 - 示例、问题和关注点

最近我一直在尝试更好地理解在 C++ 中使用工厂模式。

我查阅了以下资源:

如何在C++中正确实现工厂方法模式

https://www.geeksforgeeks.org/design-patterns-set-2-factory-method/

https://sourcemaking.com/design_patterns/factory_method/cpp/1

https://www.codeproject.com/Articles/363338/Factory-Pattern-in-Cplusplus

https://www.bogotobogo.com/DesignPatterns/factorymethod.php

https://gist.github.com/pazdera/1099562

https://en.wikibooks.org/wiki/C%2B%2B_Programming/Code/Design_Patterns

在有人将其标记为“不是问题”之前,我确实有一些明确的问题,我稍后会讨论。但为了首先澄清我到目前为止的理解,我想从一个例子开始。这是我从上述链接中的信息中得到的最好的例子(最好的含义说明了工厂模式,但尽可能简单,因此该模式的初学者可以清楚地看到所涉及的问题):

// FactoryPattern.cpp

#include <iostream>
#include <vector>

enum AnimalSpecies { dog, cat };


class Animal
{
public:
  virtual void makeSound() = 0;
};

class Dog : public Animal
{
public:
  void makeSound() { std::cout << "woof" << "\n\n"; }
};

class Cat : public Animal
{
public:
  void makeSound() { std::cout << "meow" << "\n\n"; }
};

class AnimalFactory
{
public:
  static Animal* makeAnimal(AnimalSpecies animalSpecies);
};

Animal* AnimalFactory::makeAnimal(AnimalSpecies animalSpecies) …
Run Code Online (Sandbox Code Playgroud)

c++ factory-pattern

7
推荐指数
1
解决办法
8643
查看次数