根据传递给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)
你会怎么做?哪个分支声明?等等...
我希望能够将一个ExecutorService实例注入到我的Spring服务中,Spring API建议将其ThreadPoolExecutorFactoryBean用于此目的.很简单的问题; 我该如何使用它ThreadPoolExecutorFactoryBean创建一个ExecutorService我可以连接到我的其他服务?
我觉得他是一个完全白痴问他的问题,但我似乎无法理解这一点.
我想控制一堆类的创建,这些类都共享一个公共接口,并且在构造中都需要一些逻辑.另外,我不希望除了类工厂之外的任何其他代码能够从这些类创建对象.
我的主要障碍是:
(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)
任何帮助非常感谢:)
在调查代码后我发现:
<bean id="TestBean" class="com.test.checkDate"
factory-method="getPreviousDate">
<constructor-arg value .............
...............................
Run Code Online (Sandbox Code Playgroud)
怎么可能?谢谢.
我想实现一个用于创建对象的工厂函数.我的对象模板如下所示:
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),因为它无法在编译时确定,我认为这是该工厂的重点.事实上,ta并tb从文件(或网络)阅读.
我想要一个更简单的解决方案来避免烦人的2级开关.
我认为我的问题类似于how-would-one-write-a-meta-if-else-if-in-c,除了我不能使用静态参数. …
我有一种情况,我有一个类,在其泛型类型参数中接受某个对象类型的实例.布局是这样的:
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) 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) 我有一些格式化程序的接口:
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) 抛开关于你是否应该测试模型关联的存在的论据,我有一个模型被调用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) 我有一个(不断增长的)数据生成器列表.我需要的生成器是由工厂类创建的.生成器都实现了一个通用接口,其中包括一个静态字符串name.
我想做什么:使用上述名称的字符串参数调用factory.Create方法.create方法使用此名称查找生成器并返回所述生成器的新实例.
我认为这样做的好处是:我只需添加新的生成器类而无需编辑工厂.
题:
最后我会这样称呼工厂(简化):
//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)