所以这是交易.我有我的解决方案,里面有几个项目:
我的包装器应用程序包含我的app.config,我的插件应该直接引用自我配置.这样我的包装器应用程序除了需要调用适配器工厂来新建插件实例之外,不需要知道任何其他内容.
<configuration>
<appSettings>
<add key="Plugin" value="Prototypes.BensPlugin" />
<add key="Prototypes.BensPlugin.ServiceAddress" value="http://localhost/WebServices/Plugin.asmx" />
<add key="Prototypes.BensPlugin.Username" value="TestUserName" />
<add key="Prototypes.BensPlugin.Password" value="TestPassword" />
</appSettings>
</configuration>
Run Code Online (Sandbox Code Playgroud)
包装项目:
using Worker;
public class Program
{
public static void Main()
{
var serviceProc = new ServiceProcess();
serviceProc.DoYourStuff();
}
}
Run Code Online (Sandbox Code Playgroud)
工人项目:
using PluginLibrary;
namespace Worker
{
public class ServiceProcess
{
public string GetRequiredAppSetting(string settingName)
{
/* Code to get a required configuration setting */
}
public …Run Code Online (Sandbox Code Playgroud) 我有一些像这样的代码:
public abstract class Foo {
public static Foo getFoo() {
return new FooImpl();
}
abstract void DoFoo();
private class FooImpl extends Foo {
public FooImpl() { }
@Override
void DoFoo() { }
}
}
Run Code Online (Sandbox Code Playgroud)
但是Eclipse告诉我No enclosing instance of type Foo is accessible.所以我怎样才能让它工作?
我试图让它尽可能简单,看它是否会编译:
public abstract class Foo {
public static Foo getFoo() {
return new FooImpl();
}
private static class FooImpl extends Foo {
public FooImpl() { }
}
}
Run Code Online (Sandbox Code Playgroud)
我仍然得到同样的错误.我错过了什么?
固定!我改了行return new FooImpl();到return …
是否可以在通用方法中使用其内部构造函数构造对象?
public abstract class FooBase { }
public class Foo : FooBase {
internal Foo() { }
}
public static class FooFactory {
public static TFooResult CreateFoo<TFooResult>()
where TFooResult : FooBase, new() {
return new TFooResult();
}
}
Run Code Online (Sandbox Code Playgroud)
FooFactory与驻留在同一程序集中Foo。类调用工厂方法,如下所示:
var foo = FooFactory.CreateFoo<Foo>();
Run Code Online (Sandbox Code Playgroud)
他们得到编译时错误:
“ Foo”必须是具有公共无参数构造函数的非抽象类型,才能在通用类型或方法“ FooFactory.CreateFoo()”中用作参数“ TFooType”
有什么办法可以解决这个问题?
我也尝试过:
Activator.CreateInstance<TFooResult>();
Run Code Online (Sandbox Code Playgroud)
这会在运行时引发相同的错误。
除了罕见的情况,eval()在JavaScript中被认为是不好的做法.
我刚刚遇到一个代码片段,它接受一个字符串并按该类型名称构造一个对象.执行此操作的错误检查,业务逻辑和上下文已删除,这是它的样子:
function factory(klass) {
eval("var obj = new " + klass + "()"); // Is there a better way?
return obj;
}
Run Code Online (Sandbox Code Playgroud)
是否有更好的(更安全,更清洁和/或更快)的方法来完成类创建而不使用eval?
我正在寻找一种通过名称创建类的通用方法.
例如,想象一下,例如,代码的另一部分动态地加载JavaScript文件,生成代码或允许用户扩展,但是代码的其他部分需要在没有工厂事先知道其存在的情况下制作该类.
我一直在网上试图了解工厂方法是什么,但我没有找到任何显示具体例子的简单例子.我简要介绍了其中一本书,但它没有展示一个例子,也没有解释它们是什么"类方法通常用作工厂方法".
1- Objective-C中工厂方法的语法和用法是什么? 这是我找到的最接近的答案,但是当我在评论中尝试这个例子作为答案时,我收到一条消息说我不能打电话给超级.在这个问题中,我更关注工厂方法的实现语法.
2-工厂方法在其他语言中是什么叫做构造函数?
3-工厂方法与单身人士相比如何?
来自Apple文档:
它们在一个步骤中组合分配和初始化,并返回创建的对象
单身人士不是吗?
在下面的单例示例中,我们可以说类方法sharedData是一个工厂方法吗?
.m文件
#import "SingletonModel.h"
@implementation SingletonModel
static SingletonModel *sharedData;
- (id) init {
if (self = [super init]) {
// custom initialization
}
return self;
}
// is this a factory method?
+(SingletonModel*) sharedData
{
if (!sharedData) {
sharedData = [[SingletonModel alloc]init];
}
return sharedData;
}
@end
Run Code Online (Sandbox Code Playgroud) 我正在使用Rails 4.我有一个类Cart,需要在我的应用程序中访问.
我希望使用工厂模式访问它:
class CartFactory
def self.obtain_cart_for_user(user)
...
end
end
Run Code Online (Sandbox Code Playgroud)
我需要这种方法,因为有时,我想要返回一个现有的购物车,有时会创建一个新的购物车(根据购物车的年龄,其内容,其中的产品是否仍然可用等).
这很容易.
但是,我还想确保其他未来的程序员不直接实例化购物车,或通过任何其他方式获取,包括通过模型关联,例如:
Cart.new(...)
user.carts.new(...)
Cart.find(id)
Cart.find_by_attribute(blah: blah)
Cart.where(...).first
Run Code Online (Sandbox Code Playgroud)
有什么方法可以阻止这种情况吗?
在这个问题中,接受的答案使用以下语法:
typedef std::map<std::string, Base*(*)()> map_type;
Run Code Online (Sandbox Code Playgroud)
有人可以解释(*)的意思,我以前从未见过它吗?
我有一个方法如下:
public class FooFactory {
public Foo createNewFoo(){
return new foo();
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我这样做:
FooFactory fooFactory = new FooFactory();
Foo foo = FooFactory.createNewFoo();
Run Code Online (Sandbox Code Playgroud)
它会完美地运作.但是,如果我尝试这样做:
new Foo() = FooFactory.createNewFoo();
Run Code Online (Sandbox Code Playgroud)
它似乎根本不起作用.它说"变量预期".
我理解,new Foo()它本身会创建一个新的Foo对象,但即使我使用工厂,它也应该用新Foo对象覆盖匿名对象.
我也试过创造一个ArrayList拥有Foo和做的东西
arrayList.add(new Foo());
arrayList.get(0) = FooFactory.createNewFoo();
Run Code Online (Sandbox Code Playgroud)
它仍然说"变量预期".为什么这么说?
Foo foo = new Foo();
Foo otherFoo = foo;
Run Code Online (Sandbox Code Playgroud)
这非常好用,所以我不明白为什么我不能让工厂使用匿名对象.
我尝试在网上搜索这个,但我没有搜索结果,这告诉我,我可能犯了一些荒谬的错误/使用工厂模式错了.
这与Joshua Bloch撰写的"Effective Java"一书中创建和销毁对象有关
第1项:考虑静态工厂方法而不是构造函数
此方法将布尔基元值转换为布尔对象引用:
public static Boolean valueOf(boolean b) {
return b ? Boolean.TRUE : Boolean.FALSE;
}
Run Code Online (Sandbox Code Playgroud)
请注意,静态工厂方法与"设计模式"中的"工厂方法"模式不同[Gamma95,p.107].此项中描述的静态工厂方法在设计模式中没有直接等效项.
作者似乎在谈论静态工厂方法和工厂方法模式之间的区别.这有什么区别?
另外一点,BalusC 在这个帖子中提到了 Factory Method下的一个链接,java.util.Calendar#getInstance()这是一个静态工厂方法,因此建议静态工厂方法是Factory Method Pattern的子集.
我正在使用faker.js库生成随机数据,我有几个工厂函数生成一系列用户数据:
const createUser = () => {
return {
name: faker.name.findName(),
email: faker.internet.email(),
address: faker.address.streetAddress(),
bio: faker.lorem.sentence(),
image: faker.image.avatar()
}
}
const createUsers = (numUsers = 5) => {
return Array(numUsers).fill(createUser());
}
let fakeUsers = createUsers(5)
console.log(fakeUsers)
Run Code Online (Sandbox Code Playgroud)
这种Array.fill方法的问题在于它返回相同的数据n次数.我希望从我的工厂退回5个不同的用户.
我该怎么做呢?
factory-pattern ×10
java ×3
c# ×2
factory ×2
javascript ×2
.net ×1
arrays ×1
c++ ×1
eval ×1
faker ×1
generics ×1
ios ×1
objective-c ×1
ruby ×1