我用一个例子更好地解释这个问题.我有一个可用于访问数据的接口模型.可以有不同的Model实现,它可以表示各种格式的数据,例如XMl,txt格式等.模型不关心格式.让我们说一个这样的实现是myxmlModel.
现在我想强制myxmlModel和Model的其他每个实现都遵循Singleton Pattern.通常的方法是将myxmlModels构造函数设为私有并提供一个静态工厂方法来返回myModel类的实例.但问题是接口不能有静态方法定义结果我不能在Model的所有实现上强制执行特定的Factory方法定义.因此,一个实现可能以提供getObject()结束,而其他实现可能已经获得NewModel()..
一个解决方法是允许对myxmlModel的构造函数进行包访问,并创建一个Factory类,该类创建myxmlModel对象并将其缓存以供进一步使用.
我想知道是否有更好的方法来实现相同的功能.
我目前正在发现scala,我想知道我是否可以使用工厂的特性.
我试过这个:
abstract class Foo {
...
}
object Foo {
def apply() = new Bar
private class Bar extends Foo {
...
}
}
Foo() with MyTrait // Not working
我想这是因为with必须先于new.
有没有办法做到这一点?
谢谢
在查看从WCF库反映的一些代码时,我看到了用于创建异常的模式:
if(argument == null)
{
throw Error.ArgumentNull("argument");
}
Run Code Online (Sandbox Code Playgroud)
空参数是最简单的示例,其他类型的异常可通过静态错误类获得.
这种工厂模式的价值是多少?为什么不使用new运算符并简单地调用ArgumentNullException构造函数?
使用MEF导入许多"ServiceProviders"的桌面应用程序.每个部分(ServiceProvider)都是一个单独的DLL内的类.所有DLL都在"插件"文件夹中,由桌面应用程序使用.
由于我需要新部件的实例,ExportFactory因此是最佳选择.问题是我的部件有构造函数.我需要将一些参数传递给部件的构造函数ExportFactory(MEF2,Preview2)不支持.
我需要这样的东西:
// Each part has its own dependency
Dependency dependency = LoadDependency(myPart.Metedata["Name"]);
// Injecting dependency into part's constructor
myPart.CreateExport(dependency);
Run Code Online (Sandbox Code Playgroud)
我不想从我的零件方面导入任何东西.
可在此处找到示例项目(带无参数构造函数).
我只是在学习java,我遇到了一些问题.这里我们有简单的工厂模式:
public class SomeFactory {
...
public static void registerProduct(String name, Class<? extends IProduct > f)
}
public SomeProduct implements IProduct {
static {
SomeFactory.register("some product", SomeProduct.class);
}
...
}
Run Code Online (Sandbox Code Playgroud)
所有产品都应在工厂注册.
但在使用此代码之前,应加载所有Products类.我可以放在Class.forName()某个地方,例如在main函数中.但我想避免这种手动类加载.我想添加新的IProduct
实现,而不更新其他部分(例如SomeFactory或Main方法等).但我想知道,是否有可能自动加载一些类(例如标有注释)?
PS我想注意,在运行时不会添加其他类,所有IProduct实现在编译之前都是已知的.
UPD#1
感谢您的回答!但是有可能使用IProduct实例生成自动生成的属性文件吗?我的意思是有可能制作一些生成属性文件或加载器代码的构建时脚本(例如maven)吗?有这样的解决方案或框架吗?
UPD#2 我完成了使用Reflections库,它通过在启动时扫描类路径来提供运行时信息.
我正在使用AngularJS Seed,我希望看到一个Web Worker的工作实现.
我想让一个简单的Web Worker工作,以便理解它,但我遇到了一个功能问题.
我在services.js中有Web Worker代码,如下所示:
'use strict';
/* Services */
var app = angular.module('myApp.services', []).
app.factory("HelloWorldService",['$q',function($q){
var worker = new Worker('js/doWork.js');
var defer;
worker.addEventListener('message', function(e) {
console.log('Worker said: ', e.data);
defer.resolve(e.data);
}, false);
return {
doWork : function(myData){
defer = $q.defer();
worker.postMessage(myData); // Send data to our worker.
return defer.promise;
}
};
}]);
Run Code Online (Sandbox Code Playgroud)
在js文件夹中,我有一个文件doWork.js,其内容是:
self.addEventListener('message', function(e) {
self.postMessage(e.data);
}, false);
Run Code Online (Sandbox Code Playgroud)
我的controllers.js文件是空的,看起来像这样:
'use strict';
/* Controllers */
var app …Run Code Online (Sandbox Code Playgroud) 在我正在研究的项目中(不是我的项目,只是在研究它),有很多这样的结构:
project.priv.logic.MyServiceImpl.java
project.priv.service.MyServiceFactoryImpl.java
project.pub.logic.MyServiceIF.java
project.pub.service.MyServiceFactoryIF.java
project.pub.service.MyServiceFactorySupplier.java
Run Code Online (Sandbox Code Playgroud)
服务的调用方式如下:
MyServiceFactorySupplier.getMyServiceFactory().getMyService()
Run Code Online (Sandbox Code Playgroud)
据我所知,工厂用于隐藏更改MyServiceImpl位置或内容的实现MyServiceImpl.但为什么我的工厂(供应商)还有另一家工厂?我认为我的Factory和FactorySupplier改变的概率大致相等.另外我还没有找到一个案例,其中创建的工厂是动态创建的(我认为这将是抽象工厂模式中的情况)但只返回MyServiceFactoryImpl.getInstance().通常的做法是实施FactorySupplier吗?有什么好处?
这个PHP问题与这个问题有关,但有点不同.我有一个静态工厂方法create(),它实例化一个类实例.我希望该方法动态实例化调用它的(子)类的实例.因此,它必须在运行时确定它实例化的类.但是我想这样做而不必重新定义子类中的静态工厂方法(这在我的例子中完全有效,因为子类没有新的数据成员来初始化).这是可能吗?
class Foo {
private $name;
public static function create($name) {
//HERE INSTED OF:
return new Foo($name);
//I WANT SOMETHING LIKE:
//return new get_class($this)($name);//doesn't work
//return self($this);//doesn't work either
}
private function __construct($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
}
// the following class has no private data, just extra methods:
class SubFoo extends Foo {
public function getHelloName() {
echo "Hello, ", $this->getName(), ".\n";
}
}
$foo = Foo::create("Joe"); …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个公开简单用户API的工厂.我是AngularJS的新手,我对工厂以及如何使用它们有点困惑.我见过其他主题,但没有一个与我的用例很匹配.
为简单起见,我想要实现的唯一功能是将所有用户放入阵列中,然后通过注入的工厂将它们传递给控制器.
我将用户存储在json文件中(现在我只想读取该文件,而不修改数据)
users.json:
[
{
"id": 1,
"name": "user1",
"email": "a@b.c"
},
{
"id": 2,
"name": "user2",
"email": "b@b.c"
}
]
Run Code Online (Sandbox Code Playgroud)
我想写的工厂应该是这样的:
UsersFactory:
app.factory('usersFactory', ['$http', function ($http) {
return {
getAllUsers: function() {
return $http.get('users.json').then(
function(result) {
return result.data;
},
function(error) {
console.log(error);
}
);
}
};
}]);
Run Code Online (Sandbox Code Playgroud)
最后,控制器调用将是这样的:
UsersController
app.controller('UsersCtrl', ['$scope', 'usersFactory', function($scope, usersFactory){
usersFactory.getAllUsers().then(function (result) {
$scope.users = result;
});
}]);
Run Code Online (Sandbox Code Playgroud)
我在网上搜索过,似乎以这种方式使用工厂并不是一个好习惯,如果我想实现更多功能,比如在数据源中添加/删除新用户,或者某种方式将数组存储在工厂中,这不是那种方法.我见过一些使用工厂的地方new UsersFactory().
尝试使用API时,使用工厂的正确方法是什么?
是否可以使用包含$http.get()结果的对象初始化工厂,然后以这种方式从控制器中使用它?
var usersFactory = new UsersFactory(); // at this …Run Code Online (Sandbox Code Playgroud) 我想用需要参数的工厂方法在Unity容器中注册一个类型。这些参数应统一解决,但只能在运行时解决。
工厂方法代码:
public static IApp Create(IOne, ITwo) {...}
Run Code Online (Sandbox Code Playgroud)
注册代码:
container.RegisterType(typeof(IApp), new InjectionFactory(f => App.Create(???, ???)));
Run Code Online (Sandbox Code Playgroud)
我需要什么来替换“ ???” ?
更多信息:
我的Unity配置分为两个阶段。第一阶段(应用程序正在启动),我注册了除一个对象之外的所有对象:
container.RegisterType<IOne, One>();
container.RegisterType<ITwo, Two>();
container.RegisterType<IApp, App>();
// ...
Run Code Online (Sandbox Code Playgroud)
第二阶段(用户登录),我中庸之道注册谁在我所有的类的构造函数中使用的上下文对象的实例(One,Two,App,...):
var childContainer = container.CreateChildContainer();
childContainer.RegisterInstance<AppEnvironment>(new AppEnvironment(userName));
Run Code Online (Sandbox Code Playgroud)
这是我的代码,不使用InjectionFactory。工作正常。现在,我必须多次注册IApp接口,并每次都调用一个不同的静态方法。静态方法示例:
public static IApp Create(IOne one, ITwo two, AppEnvironment env)
{
_one = one;
_two = two;
_env = env;
}
Run Code Online (Sandbox Code Playgroud)
如果我向IApp注册此代码:
container.Register(typeof(IApp), new InjectionFactory(f => App.Create(container.Resolve<IOne>(), container.Resolve<ITwo>(), container.Resolve<AppEnvironment>()));
Run Code Online (Sandbox Code Playgroud)
然后没有设置我的env变量。
但是,如果我注册了我的env实例(仅出于测试目的,我不能这样做),它就可以工作。