标签: factory

工厂根据通用类型C#创建对象

根据传递给Factory类的泛型类型来实例化对象的最有效方法是什么,例如:

public class LoggerFactory
{
    public static ILogger<T> Create<T>()
    {
        // Switch Statement?
        // Generic Dictionary?
        // EX.: if "T" is of type "string": return (ILogger<T>)new StringLogger();
    }
}
Run Code Online (Sandbox Code Playgroud)

你会怎么做?哪个分支声明?等等...

c# generics factory interface

7
推荐指数
2
解决办法
1万
查看次数

如何使用Spring的ThreadPoolExecutorFactoryBean工厂bean

我希望能够将一个ExecutorService实例注入到我的Spring服务中,Spring API建议将其ThreadPoolExecutorFactoryBean用于此目的.很简单的问题; 我该如何使用它ThreadPoolExecutorFactoryBean创建一个ExecutorService我可以连接到我的其他服务?

我觉得他是一个完全白痴问他的问题,但我似乎无法理解这一点.

java spring factory

7
推荐指数
3
解决办法
1万
查看次数

c#泛型类工厂问题

我想控制一堆类的创建,这些类都共享一个公共接口,并且在构造中都需要一些逻辑.另外,我不希望除了类工厂之外的任何其他代码能够从这些类创建对象.

我的主要障碍是:

(1)对于能够创建类实例的泛型方法,我需要new()约束,这意味着我必须在类上有一个公共构造函数,这意味着它们可以公开创建.

(2)另一种方法是让类本身具有一个返回类实例的静态方法.但我无法从我的泛型类中调用它,因为我需要处理接口/类型,并且不能通过接口进行静态处理.

这是我目前得到的那种东西,但是它使用了new()约束,它允许公开创建我的类:

internal static class MyClassFactory
{
    internal static T Create<T>(string args) where T : IMyType, new()
    {
        IMyType newThing = new T();
        newThing.Initialise(string args);
        return (T)newThing;
    }
}

public interface IMyType
{
    void Initialise(string args);
}

public class ThingA: IMyType
{
public void Initialise(string args)
{
        // do something with args
}
}
Run Code Online (Sandbox Code Playgroud)

任何帮助非常感谢:)

c# generics static factory

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

怎么可以用工厂方法但没有工厂的春豆?

在调查代码后我发现:

 <bean id="TestBean" class="com.test.checkDate"
 factory-method="getPreviousDate">
 <constructor-arg value .............

 ...............................
Run Code Online (Sandbox Code Playgroud)

怎么可能?谢谢.

java spring factory javabeans

7
推荐指数
1
解决办法
2万
查看次数

如何实现具有多个开关的工厂?

我想实现一个用于创建对象的工厂函数.我的对象模板如下所示:

template <typename TA, typename TB>
struct MyImpl : public MyInterface
{
    // content
};
Run Code Online (Sandbox Code Playgroud)

我的工厂是这样的:

MyInterface* factory(char ta, char tb)
{
    if(ta == 'c' && tb == 'c')
    {
        return new MyImpl<char, char>();
    }
    if(ta == 'c' && tb == 's')
    {
        return new MyImpl<char, short>();
    }
    if(ta == 's' && tb == 'c')
    {
        return new MyImpl<short, char>();
    }
    // and so on ....
}
Run Code Online (Sandbox Code Playgroud)

工厂函数必须接受非静态char数据(ta,tb),因为它无法在编译时确定,我认为这是该工厂的重点.事实上,tatb从文件(或网络)阅读.

我想要一个更简单的解决方案来避免烦人的2级开关.

我认为我的问题类似于how-would-one-write-a-meta-if-else-if-in-c,除了我不能使用静态参数. …

c++ templates factory

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

不知道类型就返回通用

我有一种情况,我有一个类,在其泛型类型参数中接受某个对象类型的实例.布局是这样的:

public abstract BaseClass { ... }
public DiamondClass : BaseClass { ... }
public SilverClass : BaseClass { ... }

public Handler<T> where T : BaseClass { ... }
Run Code Online (Sandbox Code Playgroud)

我希望能够创建一个方法来返回输入时定义Handler<DiamondClass>Handler<BaseClass>不定义类型的实例.我试过这些方面的东西:

public Handler<BaseClass> GetHandler(HandlerType type)
{
    switch(type)
    {
        case HandlerType.Diamond: return new Handler<DiamondClass>();
        case HandlerType.Silver: return new Handler<SilverClass>();
        default: throw new InvalidOperationException("...");
    }
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为显然Handler<DiamondClass>不会隐含地施放Handler<BaseClass>.我可以这样指定:

public Handler<T> GetHandler<T>(HandlerType type) where T : BaseClass
{
    switch(type)
    {
        case HandlerType.Diamond: return (Handler<T>)new Handler<DiamondClass>(); …
Run Code Online (Sandbox Code Playgroud)

c# generics inheritance types factory

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

NameError:未初始化的常量Faker ::

Before(:all) do 
    puts "HELLO ALL :D"
end
Run Code Online (Sandbox Code Playgroud)

我的代码有问题:

/spec/factories.rb

require 'faker'
FactoryGirl.define do
    factory :booking_error do 
    booking_id       { Faker::Number.number(3).to_i }
    error_type_cd    BookingError.error_types.values.shuffle.first
    process_name     Enums::FlightEnum::PROCESSES.keys.shuffle.first
    description      "DESCRIPTION"
    old_value        "OLD_STRING"
    new_value        "NEW_STRING"
    end
end
Run Code Online (Sandbox Code Playgroud)

/spec/models/booking_error_spec.rb

require 'spec_helper'
describe BookingError do
    before(:all) do
        @booking_error       = FactoryGirl.build(:booking_error)
        @booking_error_types = BookingError.error_types
    end

    it 'Validating BookingError save.' do
        @booking_error.save.should be_true
    end
end
Run Code Online (Sandbox Code Playgroud)

Gemfile

source 'https://rubygems.org'

gem 'rails', '3.2.13'

gem 'mysql2'                , '0.3.11'
gem 'devise'                , '2.2.0.rc'
gem 'devise-encryptable'    , '0.1.1'
gem 'unicorn'               , '4.5.0'
gem 'kaminari' …
Run Code Online (Sandbox Code Playgroud)

ruby factory rspec ruby-on-rails factory-bot

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

Java泛型与工厂

建立:

我有一些格式化程序的接口:

interface Formatter<T extends AbstractItem> {
  String format(T item);
}
Run Code Online (Sandbox Code Playgroud)

我有一个工厂创建这样的格式化程序:

public class Factory {
  public static Formatter<? extends AbstractItem> create() {
    switch (something) {
      case SOMETHING: return new Formatter<SomeItem>() { String format(SomeItem item) {...}};
      case SOMETHING_ELSE: return new Formatter<OtherItem>() { String format(OtherItem item){...}};
    }
Run Code Online (Sandbox Code Playgroud)

现在我使用这个工厂来获取格式化程序并使用它:

1: Formatter formatter = Factory.create();
2: for (AbstractItem item : items) {
3:   formatter.format(item);
4: }
Run Code Online (Sandbox Code Playgroud)

items列表仅包含能够处理的AbstractItem子类型formatter.

问题:

我收到两个警告:

Line 1: Formatter is a raw type. References …
Run Code Online (Sandbox Code Playgroud)

java generics factory

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

使用FactoryGirl验证has_many关联至少具有一个模型

抛开关于你是否应该测试模型关联的存在的论据,我有一个模型被调用Order,我正在验证它item在其has_many关联中至少有一个使用:

class Order < ActiveRecord::Base

  has_many :items

  validates :items, presence: true

end
Run Code Online (Sandbox Code Playgroud)

我已将FactoryGirl设置为lint我的工厂(检查有效性).所以我的订单工厂无效,除非我为其has_many收藏品创建一个项目.

我的orders工厂看起来像这样:

FactoryGirl.define do

  factory :order do

    ignore do
      items_count 1
    end

    after(:build) do |order, evaluator|
      create_list(:item, evaluator.items_count, order: order)
    end

  end
end
Run Code Online (Sandbox Code Playgroud)

根据Factory Girl的入门指南:

FactoryGirl.lint builds each factory and subsequently calls #valid? on it
Run Code Online (Sandbox Code Playgroud)

但是,当我运行我的规格时,Factory Girl会抛出一个FactoryGirl::InvalidFactoryError因为订单工厂无效.

解决方法

after(:build) do |order, evaluator|
   evaluator.items_count.times do
     order.items << FactoryGirl.create(:item)
   end
   #create_list(:item, evaluator.items_count, order: order)
 end
Run Code Online (Sandbox Code Playgroud)

ruby factory rspec ruby-on-rails factory-bot

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

工厂模式,按财产选择

我有一个(不断增长的)数据生成器列表.我需要的生成器是由工厂类创建的.生成器都实现了一个通用接口,其中包括一个静态字符串name.

我想做什么:使用上述名称的字符串参数调用factory.Create方法.create方法使用此名称查找生成器并返回所述生成器的新实例.

我认为这样做的好处是:我只需添加新的生成器类而无需编辑工厂.

题:

  1. 这是处理这个问题的好方法吗?
  2. 我怎样才能找到所有发电机?反映接口的每个实现/命名空间的每个成员(对于生成器及其接口是唯一的)?
  3. 称这种工厂工作方式是正确的,还是这种模式不同?

最后我会这样称呼工厂(简化):

//Caller
public DataModel GetData2()
{
    var generator = new DataFactory().Create("Gen.2");
    return generator.GetData();
}

//Factory
public class DataFactory
{
    public AbstractDataGenerator Create(string type)
    {
        //Here the magic happens to find all implementations of IDataGenerator
        var allGenerators = GetImplementations();
        var generator = allGenerators.FirstOrDefault(f => f.name == type);
        if (generator != null)
            return (AbstractDataGenerator)Activator.CreateInstance(generator);
        else
            return null;
    }
}

//Interface
public abstract class AbstractDataGenerator
{
    public static string name;
    public abstract DataModel GetData(); …
Run Code Online (Sandbox Code Playgroud)

c# design-patterns factory

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