抛出Jr.和Mid级开发人员的一个很好的简单问题,如果有机会编程到接口(如简单的工厂模式),他们是否会这样做?
在代码审查中,出现了以下评论:"我认为,您实际上是指将工厂注入实例,以便您可以在需要时重新启动工厂." 并且"重要提示:工厂不应该是静态的,而应该注入."
Test.java:
Foo foo = FooFactory.get(argument);
Run Code Online (Sandbox Code Playgroud)
FooFactory.java:
public final class FooFactory {
public static Foo get(String argument) {
return new Foo();
}
}
Run Code Online (Sandbox Code Playgroud)
我应该怎么做呢?"重新绑定"在评论者的第一条评论中意味着什么?
我正在尝试使用Guice 3.0 AssistedInject,它不会实例化工厂.
SSCCE代码:
public class ParentClass() {
@Inject private MyFactory myFactory;
private final Foo foo;
private final Bar bar;
public ParentClass() {
if(myFactory == null) System.err.println("Error: I should have injected by now!");
foo = myFactory.create(new Map<String, Object>());
// etc.
}
}
Run Code Online (Sandbox Code Playgroud)
public interface MyFactory {
Foo create(Map<String, Object> mapA);
Bar create(Map<String, Object> mapB, Map<String, Object> mapC);
}
Run Code Online (Sandbox Code Playgroud)
public class ParentModule extends AbstractModule {
@Override
protected void configure() {
install(new FactoryModuleBuilder()
.implement(Foo.class, FooImpl.class)
.implement(Bar.class, BarImpl.class)
.build(MyFactory.class)); …Run Code Online (Sandbox Code Playgroud) 在一篇文章中我读到了jQuery中的工厂函数,但我在互联网上找不到任何相关内容.他们是什么,他们做了什么?
如果我有一个看起来像这样的服务:
app.factory('User', function($http, User) {
var User = function(data) {
angular.extend(this, data);
};
User.prototype.create = function() {
var user = this;
return $http.post(api, user.getProperties()).success(function(response) {
user.uid = response.data.uid;
}).error(function(response) {
});
};
User.get = function(id) {
return $http.get(url).success(function(response) {
return new User(response.data);
});
};
return User;
});
Run Code Online (Sandbox Code Playgroud)
如何在控制器中获取User在get()函数中创建的内容?
目前我所拥有的是:
app.controller('UserCtrl', function($scope, User) {
$scope.user = null;
User.get($routeParams.rid).success(function(u) {
$scope.user = new User(u.data);
});
});
Run Code Online (Sandbox Code Playgroud)
问题在于UserCtrl获得api响应,而不是从success()工厂返回的值.我更喜欢在工厂制作新用户,而不是将api响应传递给控制器.
我想实施一个工厂.在我的应用程序中只有一个这个工厂的实例.我的工厂需要在创建第一个MyObject之前做一些准备,然后才开始.有没有更好的方法来做到这一点
object MyObjectFactory {
private var isApplied:Boolean = false
def apply() = {
if(!isApplied) {
isApplied = true;
onLoad
}
//do something
new MyObject
}
def onLoad {
//prepare environment
}
}
Run Code Online (Sandbox Code Playgroud) 我有一些英雄课程,从抽象类Warrior扩展:
enum Warrior_ID { Infantryman_ID=0, Archer_ID, Horseman_ID };
class Warrior
{
public:
virtual void info() = 0;
virtual ~Warrior() { }
static unique_ptr<Warrior> createWarrior( Warrior_ID id );
};
class Infantryman: public Warrior
{
public:
void info()
{
cout << "Infantryman" << endl;
}
};
class Archer: public Warrior
{
public:
void info()
{
cout << "Archer" << endl;
}
};
class Horseman: public Warrior
{
public:
void info()
{
cout << "Horseman" << endl;
}
};
Run Code Online (Sandbox Code Playgroud)
这是我的工厂方法,它返回特定的字符:
unique_ptr<Warrior> Warrior::createWarrior( Warrior_ID …Run Code Online (Sandbox Code Playgroud) 当我使用php artisan db:seed时出现错误?在UserFactory.php第27行中:
Type error: Argument 1 passed to
Illuminate\Database\Eloquent\Factory::{closure}() must be an instance
of Faker\Generator\Generator, instance of Faker\Generator given
Run Code Online (Sandbox Code Playgroud)
Userfactory.php
使用Faker \ Generator作为Faker;
(这是第27行)
$factory->define(App\Models\Admin::class, function (Faker\Generator $faker) {
static $password;
return [
'name' => $faker->name,
'email' => $faker->safeEmail,
'password' => $password ?: $password = bcrypt('secret'),
'remember_token' => str_random(10),
];
});
Run Code Online (Sandbox Code Playgroud)
AdminsTableSeeder.php
public function run()
{
factory('App\Models\Admin',3)->create([
'password' => bcrypt('123456')
]);
}
Run Code Online (Sandbox Code Playgroud)
DatabaseSeeder.php
public function run()
{
// $this->call(UsersTableSeeder::class);
$this->call(AdminsTableSeeder::class);
}
Run Code Online (Sandbox Code Playgroud)
我不知道怎么回事。
我建立某种工厂方法返回一个DerivedClass为BaseClass下列方式:
BaseClass Factory()
{
return DerivedClass();
}
Run Code Online (Sandbox Code Playgroud)
是的,BaseClass当我调用该方法时,将使用的move构造函数:
BaseClass object = Factory();
Run Code Online (Sandbox Code Playgroud)
由于我无法制作的move构造函数BaseClass virtual,是否有其他方法可以强制采用的move构造函数DerivedClass?
Edit1:其他信息-我已经考虑过指针。但问题是,我想将工厂函数导出到DLL中,并且希望对用户来说尽可能地容易。标准指针可能会导致内存泄漏,另一方面,并不是每个人都对智能指针熟悉。
Edit2:据我了解,真正的问题是:多态性是否也可以按值返回?
答案是否定的。
我正在阅读有关静态工厂方法的信息。静态工厂方法编码技术仅适用于Java,还是可以适用于C#.Net?似乎更像是Java。
https://dzone.com/articles/constructors-or-static-factory-methods
class Color {
private final int hex;
static Color makeFromRGB(String rgb) {
return new Color(Integer.parseInt(rgb, 16));
}
static Color makeFromPalette(int red, int green, int blue) {
return new Color(red << 16 + green << 8 + blue);
}
static Color makeFromHex(int h) {
return new Color(h);
}
private Color(int h) {
return new Color(h);
}
}
Run Code Online (Sandbox Code Playgroud)