我是 DI 模式的新手,因此,这是我的问题。
如果我有某个工厂实现了一些业务逻辑,并在运行时根据给定的输入参数创建了它的主要对象及其依赖项,我应该如何实现它才能不破坏 DI 原则?(它是否应该避免直接调用 new 运算符来实例化其主要对象(由该工厂生产)及其依赖项,不是吗?)
(4 月 11 日编辑结束)
考虑以下 CarFactory 示例:
interface IEngine {}
class RegularEngine implements IEngine {}
class AdvancedEngine implements IEngine {}
class Car
{
private $engine;
public function __construct(IEngine $engine)
{
$this->engine = $engine;
}
}
class CarFactory
{
public function __invoke(bool $isForVipCustomer = false): Car
{
// @todo Here, CarFactory creates different Enginges and a Car,
// but they should be injected instead?
$engine = $isForVipCustomer ? …Run Code Online (Sandbox Code Playgroud) 我正在努力熟悉 JavaScript 术语。我想我对iteratee、callback和function factory术语感到困惑
让我用下面这个愚蠢的例子:
//this function accept an array and then returns a new array that
//contains the elements of the first array altered by func
function mapForEach(arr, func) {
var newArr = [];
for (var i = 0; i < arr.length; i++) {
newArr.push(func(arr[i]));
}
return newArr;
}
//this function multiplies two numbers
var multiply = function (a, b) {
console.log(a * b);
};
//this is a silly function that passes a …Run Code Online (Sandbox Code Playgroud) 我正在阅读有关工厂设计模式的文章,该模式有 3 种形式:简单工厂、工厂方法和抽象工厂。
据我了解,简单工厂不是一种设计模式,它只是一种封装对象创建代码的类型,与 if/switch 语句结合使用,或者直接加载类,如果类不存在,则异常!
当我尝试转向工厂方法时,我找不到足够清晰的示例来将其从简单工厂中推迟。
你们能举一个例子来解释工厂方法以及它如何与简单工厂不同吗?
谢谢。
我正在尝试在一个类上创建工厂方法,该类会自动转换为它所在的类。
extension NSObject {
// how can I get the return type to be the current NSObject subclass
// instead of NSObject?
class func create() -> NSObject {
return self.init()
}
// example: create(type: NSArray.self)
class func create<T:NSObject>(type:T.Type) -> T {
return T()
}
}
Run Code Online (Sandbox Code Playgroud)
示例二有效,但作为类方法没有任何优势:
let result = NSArray.create(type: NSArray.self)
Run Code Online (Sandbox Code Playgroud)
但我希望能够打电话:
let result = NSArray.create()
Run Code Online (Sandbox Code Playgroud)
而不必事后施法。有没有办法在 Swift 中做到这一点?
如果你能弄清楚如何重命名这个问题,我愿意接受建议。
在 Dart 语言中,可以编写一个带有 final 字段的类。这些是只能在构造函数体运行之前设置的字段。这可以在声明时(通常用于类内的静态常量),在声明构造函数或使用this.field速记时的初始化列表语法中:
class NumBox{
final num value;
NumBox(this.value);
}
Run Code Online (Sandbox Code Playgroud)
假设我实际上需要对实例创建进行一些处理,并且不能只是在构造函数之前初始化该字段。我可以切换到使用带有 getter 的私有非最终字段:
class NumBox{
num _value;
NumBox(num v) {
_value = someComplexOperation(v);
}
num get value => _value;
}
Run Code Online (Sandbox Code Playgroud)
或者我可以使用工厂构造函数获得类似的行为:
class NumBox{
final num value;
factory NumBox(num v) {
return new NumBox._internal(someComplexOperation(v));
};
NumBox._internal(this.value);
}
Run Code Online (Sandbox Code Playgroud)
几年前我尝试学习 Dart 时遇到了类似的问题,现在我有更多的包袱,我仍然不知道。什么是更聪明的方法来做到这一点?
我正在使用 Laravel 5.6 并且数据库播种器不工作。我试图在我的数据库中插入 100 个新数据,但没有插入任何数据。没有显示错误,我不知道为什么php artisan db:seed不起作用
这是我的 DatabaseSeeder.php
<?php
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
public function run()
{
$students = factory(App\Student::class, 100)->make();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的 StudentFactory.php
use Faker\Generator as Faker;
$factory->define(App\Student::class, function (Faker $faker) {
return [
'id' => $faker->unique()->numberBetween(1,1000),
'rfid_number' => $faker->unique()->numberBetween(1,1000),
'first_name' => $faker->firstName,
'middle_name' => $faker->lastName,
'last_name' => $faker->lastName,
'name_extension' => $faker->suffix,
'email' => $faker->safeEmail,
'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret
'photo' => '',
'house_number' => $faker->buildingNumber,
'barangay' => $faker->streetName,
'city' => …Run Code Online (Sandbox Code Playgroud) 让我们假设这个工厂:
后工厂.php
$factory->define(Post::class, function (Faker $faker) {
return [
'title'=>$faker->word,
'user_id'=>factory(User::class)->create()->id
];
});
Run Code Online (Sandbox Code Playgroud)
然后我像这样使用它:
$user = factory(User::class)->create();
factory(Post::class, 5)->create(['user_id'=>$user->id]);
Run Code Online (Sandbox Code Playgroud)
我希望将创建 1 个用户和 5 个帖子。但实际上数据库中有6个用户,因为PostFactory无论是否user_id通过都会创建用户。
如果user_id属性传递给create方法,有没有办法阻止创建新用户?
Let's say I have a Human class:
class Human {
public:
bool isFemale;
double height;
Human(bool isFemale, double height) {
this->isFemale = isFemale;
this->height = height;
}
};
Run Code Online (Sandbox Code Playgroud)
and derived classes, such as Female and Male, which implement their own methods. Do I have a way, in C++11, to determine at runtime, depending on the inputs into the Human constructor, which "sub-type" (Male or Female) Human should be? I am putting different behaviour for Male and Female in their respective …
我有一个Factory类,它根据给定文件的扩展名返回一个编写器策略:
public static function getWriterForFile($file)
{
// create file info object
$fileInfo = new \SplFileInfo($file);
// check that an extension is present
if ('' === $extension = $fileInfo->getExtension()) {
throw new \RuntimeException(
'No extension found in target file: ' . $file
);
}
// build a class name using the file extension
$className = 'MyNamespace\Writer\Strategy\\'
. ucfirst(strtolower($extension))
. 'Writer';
// attempt to get an instance of the class
if (!in_array($className, get_declared_classes())) {
throw new \RuntimeException(
'No writer could be found …Run Code Online (Sandbox Code Playgroud)