标签: factory

如何编写遵循依赖注入模式的工厂?

我是 DI 模式的新手,因此,这是我的问题。

编辑 4 月 11 日

如果我有某个工厂实现了一些业务逻辑,并在运行时根据给定的输入参数创建了它的主要对象及其依赖项,我应该如何实现它才能不破坏 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)

php design-patterns factory dependency-injection

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

理解 JavaScript 中的术语 iteratee、回调、函数工厂

我正在努力熟悉 JavaScript 术语。我想我对iterateecallbackfunction 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)

javascript factory terminology callback iterate

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

工厂方法设计模式-PHP

我正在阅读有关工厂设计模式的文章,该模式有 3 种形式:简单工厂、工厂方法和抽象工厂。

据我了解,简单工厂不是一种设计模式,它只是一种封装对象创建代码的类型,与 if/switch 语句结合使用,或者直接加载类,如果类不存在,则异常!

当我尝试转向工厂方法时,我找不到足够清晰的示例来将其从简单工厂中推迟。

你们能举一个例子来解释工厂方法以及它如何与简单工厂不同吗?

谢谢。

php design-patterns factory

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

基于类的通用返回类型

我正在尝试在一个类上创建工厂方法,该类会自动转换为它所在的类。

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 中做到这一点?

generics factory swift

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

什么时候应该在 dart 中使用 final 字段、工厂构造函数或带有 getter 的私有字段?

如果你能弄清楚如何重命名这个问题,我愿意接受建议。

在 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 时遇到了类似的问题,现在我有更多的包袱,我仍然不知道。什么是更聪明的方法来做到这一点?

getter factory final dart

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

Laravel 的 db:seed 没有在数据库中插入任何记录

我正在使用 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)

factory faker laravel laravel-5

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

如果外部 ID 作为属性传递,则防止在工厂中创建关系模型

让我们假设这个工厂:

后工厂.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方法,有没有办法阻止创建新用户?

factory laravel laravel-5.6

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

Base constructor calls derived constructor depending on input - Choose object sub-type at runtime

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 …

c++ oop design-patterns factory c++11

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

所有工厂方法都应该公开吗?

根据spryker/architecture-sniffer中的规则:

默认情况下,所有工厂方法都应该是公共的

这有什么好的论据吗?我以前在使用工厂模式时从未偶然发现过这一点。

design-patterns factory spryker

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

如何使用PHPUnit测试Factory/Strategy实现

我有一个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)

php phpunit factory mocking strategy-pattern

0
推荐指数
1
解决办法
3893
查看次数