在我的应用程序中,有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(或任何其他类)实现与另一个.为了取代实施,需要两个步骤:
我想我需要某种对象工厂,但它应该相当简单,因为总是只有一种类型要创建(默认实现或用户实现).
有关如何设计像我刚刚描述的简单工厂的想法吗?考虑到将来可能会有更多类的事实,因此应该很容易扩展.
[*]我不在乎它是否不止一次发生.
编辑:请注意,TheManager中包含两个以上的对象.
我有几个具体使用以下类型的接口
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)
谢谢
我试图将一个工厂中的函数库包含在一个控制器中.类似于这样的问题: 创建通用控制器功能
我的主控制器看起来像这样:
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
我正在用ZF2和Doctrine开发一个项目.我试图在表单创建中使用Doctrine Hydrator,如本教程所示.在此方法中,将在控制器中创建ObjectManager对象,并在实例化时将其传递给新表单.当我想使用ZF2的FormElementManager时,将ObjectManager对象从控制器传递到表单会产生问题,因为ZF2要求我通过Zend\Form\FormElementManager获取表单类的实例,而不是直接实例化它.为了解决这个问题,我已经基于如何通过ZF2 FormElementManager将Doctrine ObjectManager传递给表单的问题的答案创建了表单和字段集工厂..该问题的答案中提供的方法适用于典型的fieldset元素,但我需要确定如何包含集合元素.本教程使用父字段集中的collection元素中的ObjectManager对象,我需要弄清楚如何使用工厂添加集合.
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) 我的目标是创建一组对象,每个对象都有一个唯一的标识符.如果已存在具有该标识符的对象,我想使用现有对象.否则我想创建一个新的.我试图不使用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对象此时可能已存在,也可能尚未存在.
使用工厂而不是构造函数来创建对象的阈值是多少?
利弊
更新:我在我的项目中应用Domain Driven Design的工厂模式.创建工厂背后的原因之一是减少域模型中的噪声.
谢谢
我正在为我的所有模型添加一个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类中定义的自定义选项,但这成为了老鼠的巢.我愿意接受有关该方法的指导,或任何其他建议.
我有一个通用接口处理程序
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)
我在这个工厂得到以下错误:
类型不匹配:无法转换
StringHandler为Handler<T>
如何解决这个问题?
我正在寻找有关从本地JSON文件检索数据并处理响应的最佳方法的一些信息.在浏览Stack Overflow之后,我有一些混合的想法,因为我已经看到了多种方法做同样的事情(虽然没有解释为什么一个可能会或可能不是首选).
基本上,我有一个Angular应用程序,它利用工厂从JSON文件中检索数据; 然后我在我的html文件中使用它之前等待响应在我的控制器中解析,类似于下面的内容:
厂:
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感到困惑,并且非常感谢来自更有经验/合格开发人员的一些反馈!
厂:
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)
感谢您提前提出任何意见/建议!
我想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.
如何实现上述注册SomeClass为ISomeClass等待时async的init方法?
factory ×10
angularjs ×2
c# ×2
generics ×2
java ×2
javascript ×2
.net ×1
asynchronous ×1
autofac ×1
c++ ×1
controllers ×1
django ×1
doctrine-orm ×1
forms ×1
json ×1
php ×1
polymorphism ×1