标签: factory

如何设计一个简单的C++对象工厂?

在我的应用程序中,有10-20个类被实例化一次[*].这是一个例子:

class SomeOtherManager;

class SomeManagerClass {
public:
    SomeManagerClass(SomeOtherManager*);
    virtual void someMethod1();
    virtual void someMethod2();
};
Run Code Online (Sandbox Code Playgroud)

类的实例包含在一个对象中:

class TheManager {
public:
    virtual SomeManagerClass* someManagerClass() const;
    virtual SomeOtherManager* someOtherManager() const;
    /** More objects... up to 10-20 */
};
Run Code Online (Sandbox Code Playgroud)

目前,TheManager使用new运算符来创建对象.

我的目的是能够使用插件替换SomeManagerClass(或任何其他类)实现与另一个.为了取代实施,需要两个步骤:

  1. 定义一个DerivedSomeManagerClass类,它继承了SomeManagerClass [plugin]
  2. 创建新类(DerivedSomeManagerClass)而不是默认(SomeManagerClass)[application]

我想我需要某种对象工厂,但它应该相当简单,因为总是只有一种类型要创建(默认实现或用户实现).

有关如何设计像我刚刚描述的简单工厂的想法吗?考虑到将来可能会有更多类的事实,因此应该很容易扩展.

[*]我不在乎它是否不止一次发生.

编辑:请注意,TheManager中包含两个以上的对象.

c++ factory

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

Factory类返回通用接口

我有几个具体使用以下类型的接口

interface IActivity<T>
{
    bool Process(T inputInfo);
}
Run Code Online (Sandbox Code Playgroud)

具体类如下

class ReportActivityManager :IActivity<DataTable>
{
    public bool Process(DataTable inputInfo)
    {
        // Some coding here
    }
}

class AnalyzerActivityManager :IActivity<string[]>
{
    public bool Process(string[] inputInfo)
    {
        // Some coding here
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我怎样才能编写工厂类来重新调整通用接口,比如IActivity.

class Factory
{
    public IActivity<T> Get(string module)
    {
        // ... How can i code here
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢

c# generics design-patterns factory

12
推荐指数
1
解决办法
9982
查看次数

如何在angularjs中包含/注入使用$ scope的函数到控制器?

我试图将一个工厂中的函数库包含在一个控制器中.类似于这样的问题: 创建通用控制器功能

我的主控制器看起来像这样:

recipeApp.controller('recipeController', function ($scope, groceryInterface, ...){

$scope.groceryList = [];
// ...etc...    

/* trying to retrieve the functions here */
$scope.groceryFunc = groceryInterface; // would call ng-click="groceryFunc.addToList()" in main view
    /* Also tried this:
    $scope.addToList = groceryInterface.addToList();
    $scope.clearList = groceryInterface.clearList();
    $scope.add = groceryInterface.add();
    $scope.addUp = groceryInterface.addUp(); */
}
Run Code Online (Sandbox Code Playgroud)

然后,在另一个.js文件中,我创建了工厂的groceryInterface.我把这个工厂注入上面的控制器.

recipeApp.factory('groceryInterface', function(){

        var factory = {};

    factory.addToList = function(recipe){
        $scope.groceryList.push(recipe);
                    ... etc....
    }

    factory.clearList = function() {
            var last = $scope.prevIngredients.pop();
            .... etc...
    }

    factory.add = function() …
Run Code Online (Sandbox Code Playgroud)

javascript factory dependency-injection controllers angularjs

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

如何在ZF2中的fieldset工厂中使用集合

我正在用ZF2和Doctrine开发一个项目.我试图在表单创建中使用Doctrine Hydrator,如本教程所示.在此方法中,将在控制器中创建ObjectManager对象,并在实例化时将其传递给新表单.当我想使用ZF2的FormElementManager时,将ObjectManager对象从控制器传递到表单会产生问题,因为ZF2要求我通过Zend\Form\FormElementManager获取表单类的实例,而不是直接实例化它.为了解决这个问题,我已经基于如何通过ZF2 FormElementManager将Doctrine ObjectManager传递给表单的问题的答案创建了表单和字段集工厂..该问题的答案中提供的方法适用于典型的fieldset元素,但我需要确定如何包含集合元素.本教程使用父字段集中的collection元素中的ObjectManager对象,我需要弄清楚如何使用工厂添加集合.

我试图模仿的教程中的TagFieldset:

namespace Application\Form;

use Application\Entity\Tag;
use Doctrine\Common\Persistence\ObjectManager;
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator;
use Zend\Form\Fieldset;
use Zend\InputFilter\InputFilterProviderInterface;

class TagFieldset extends Fieldset implements InputFilterProviderInterface
{
    public function __construct(ObjectManager $objectManager)
    {
        parent::__construct('tag');

        $this->setHydrator(new DoctrineHydrator($objectManager))
             ->setObject(new Tag());

        $this->add(array(
            'type' => 'Zend\Form\Element\Hidden',
            'name' => 'id'
        ));

        $this->add(array(
            'type'    => 'Zend\Form\Element\Text',
            'name'    => 'name',
            'options' => array(
                'label' => 'Tag'
            )
        ));
    }

    public function getInputFilterSpecification()
    {
        return array(
            'id' => array(
                'required' => false
            ),

            'name' …
Run Code Online (Sandbox Code Playgroud)

php forms factory doctrine-orm zend-framework2

12
推荐指数
1
解决办法
1294
查看次数

Java中的多态工厂/ getInstance()

我的目标是创建一组对象,每个对象都有一个唯一的标识符.如果已存在具有该标识符的对象,我想使用现有对象.否则我想创建一个新的.我试图不使用Singleton这个词,因为我知道这是一个肮脏的词......

我可以使用工厂方法:

    // A map of existing nodes, for getInstance.
private static Map<String, MyClass> directory = new HashMap<String, MyClass>();

public static MyClass getInstance(String name) {
    MyClass node = directory.get(name);
    if(node == null) {
       node == new MyClass(name);
    }
    return node;
}
Run Code Online (Sandbox Code Playgroud)

或者同样,我可以有一个单独的MyClassFactory方法.

但我原本打算将MyClass子类化:

public class MySubClass extends MyClass;
Run Code Online (Sandbox Code Playgroud)

如果我不再做,并调用MySubClass.getInstance():

MyClass subclassObj = MySubClass.getInstance("new name");
Run Code Online (Sandbox Code Playgroud)

...然后subclassObj将是一个普通的MyClass,而不是MySubClass.

然而,在每个子类中重写getInstance()似乎很容易.

我缺少一个简洁的解决方案吗?


这是问题的通用版本.更具体,因为回答者要求他们.

该程序用于生成表示软件片段的节点之间的依赖关系的有向图.子类包括Java程序,Web服务,存储的SQL过程,消息驱动的触发器等.

因此,该网络中的每个类都是"is-a"元素,并且具有导航和修改与其他节点的依赖关系的方法.子类之间的区别在于populate()用于从适当的源设置对象的方法的实现.

假设名为'login.java'的节点知道它对'checkpasswd.sqlpl'有依赖性:

this.addDependency( NodeFactory.getInstance("checkpasswd.sqlpl"));
Run Code Online (Sandbox Code Playgroud)

问题是checkpasswd.sqlpl对象此时可能已存在,也可能尚未存在.

java polymorphism design-patterns factory

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

使用工厂而不是构造函数来创建对象的阈值是多少?

使用工厂而不是构造函数来创建对象的阈值是多少?

  1. 你总是使用工厂.
  2. 只有在除了检查空值之外还有不变检查时才使用工厂.
  3. 你总是使用构造函数
  4. 你很少使用工厂......这些案件是什么?

利弊

更新:我在我的项目中应用Domain Driven Design的工厂模式.创建工厂背后的原因之一是减少域模型中的噪声.

谢谢

design-patterns domain-driven-design factory

11
推荐指数
3
解决办法
2181
查看次数

Django - 我可以改变特定子模型的抽象基础模型中定义的字段的构造吗?

我正在为我的所有模型添加一个slug用于序列化,所以我定义了一个使用django_autoslug中的AutoSlugField的抽象基类.

class SluggerModel(models.Model):
    slug = AutoSlugField(unique=True, db_index=False) 

    class Meta:
        abstract=True
Run Code Online (Sandbox Code Playgroud)

我还定义了一个自定义管理器和一个natural_key方法,此时我有大约20个子类,因此除了定义字段的单行之外,还有一些使得使用抽象基本模型的东西值得.

但是,我希望能够切换一些默认参数来初始化AutoSlugField某些子模型,同时仍然可以使用抽象基类.例如,我希望其中一些人使用该populate_from选项,指定其特定模型中的字段,而其他人则使用db_index=True默认值(False).

我开始尝试使用自定义Metaclass,使用在每个子模型的内部Meta类中定义的自定义选项,但这成为了老鼠的巢.我愿意接受有关该方法的指导,或任何其他建议.

django factory django-models

11
推荐指数
1
解决办法
1030
查看次数

如何用Java中的泛型实现工厂模式?

我有一个通用接口处理程序

public interface Handler<T> {
  void handle(T obj);
}
Run Code Online (Sandbox Code Playgroud)

我可以有这个接口的n个实现.假设我现在有以下2个实现.一个处理String对象,另一个处理Date

public class StringHandler implements Handler<String> {
  @Override
  public void handle(String str) {
    System.out.println(str);
  }
}

public class DateHandler implements Handler<Date> {
  @Override
  public void handle(Date date) {
    System.out.println(date);
  }
}
Run Code Online (Sandbox Code Playgroud)

我想编写一个工厂,它将根据类类型返回处理程序实例.像这样的东西:

class HandlerFactory {
  public <T> Handler<T> getHandler(Class<T> clazz) {
    if (clazz == String.class) return new StringHandler();
    if (clazz == Date.class) return new DateHandler();
  }
}
Run Code Online (Sandbox Code Playgroud)

我在这个工厂得到以下错误:

类型不匹配:无法转换StringHandlerHandler<T>

如何解决这个问题?

java generics factory

11
推荐指数
2
解决办法
9614
查看次数

Angular - 从Factory方法检索数据的最佳实践

我正在寻找有关从本地JSON文件检索数据并处理响应的最佳方法的一些信息.在浏览Stack Overflow之后,我有一些混合的想法,因为我已经看到了多种方法做同样的事情(虽然没有解释为什么一个可能会或可能不是首选).

基本上,我有一个Angular应用程序,它利用工厂从JSON文件中检索数据; 然后我在我的html文件中使用它之前等待响应在我的控制器中解析,类似于下面的内容:

选项1

厂:

comparison.factory('Info', ['$http', function($http) {
var retrievalFile = 'retrievalFile.json';

return {
 retrieveInfo: function() {
  return $http.get(retrievalFile);
 }
}

}]);
Run Code Online (Sandbox Code Playgroud)

控制器:

comparison.controller('comparisonController', ['$scope', 'Info', function($scope, Info) {

Info.retrieveInfo().then(function(response) {
  $scope.info = response.data;
});

}]);
Run Code Online (Sandbox Code Playgroud)

我的主要观点是找出何时最好等待响应解决,或者甚至是否重要.我正在想让工厂恢复履行的承诺,并等待控制器也检索数据.在我看来,最好将所有数据检索抽象出控制器并进入工厂,但我不确定这是否延伸到等待工厂本身返回的实际数据.考虑到这一点,我对是否选择选项1或选项2感到困惑,并且非常感谢来自更有经验/合格开发人员的一些反馈!

选项2

厂:

comparison.factory('Info', ['$http', function($http) {
var retrievalFile = 'retrievalFile.json';

return {
  retrieveInfo: function() {
    return $http.get(retrievalFile).then(function(response) {
      return response.data;
    });
  }
}

}]);
Run Code Online (Sandbox Code Playgroud)

控制器:

comparison.controller('comparisonController', ['$scope', 'Info', function($scope, Info) {

Info.retrieveInfo().then(function(response) {
  $scope.info = response;
});

}]);
Run Code Online (Sandbox Code Playgroud)

感谢您提前提出任何意见/建议!

javascript json factory angularjs

11
推荐指数
1
解决办法
1416
查看次数

如何在Autofac注册中调用异步方法?

我想awaitable async在注册过程中调用一个方法,如下所示:

// builder variable contains Autofac ContainerBuilder
builder.Register(
    (async (context, parameters) => // need async here
        {
            var someClass = new SomeClass(context.Resolve<ISomeDependency>());
            await someClass.SomeAsyncInitMethod(); // need to await result
            return someClass;
        })).As<ISomeClass>().SingleInstance();
Run Code Online (Sandbox Code Playgroud)

SomeClass实现ISomeClass为服务.重要的部分是someClass.SomeAsyncInitMethod()电话.这是async因为,因此我需要在await这里将async关键字放入Register方法中.但现在Autofac认为这会返回一个Task<SomeClass>不可注册的Service ISomeClass.

如何实现上述注册SomeClassISomeClass等待时async的init方法?

.net c# asynchronous factory autofac

11
推荐指数
2
解决办法
3481
查看次数