我不知道是否有这个正式的名字,但我一直在玩什么,我喜欢称之为“自我工厂”模式。基本上,当一个抽象基类作为一个工厂本身它。让我来解释一下:

我在我的系统中,它们通过接口FooInterface和BarInterface使用富对象和酒吧对象。我需要给我的客户的权利类型Foo和酒吧。其中的具体Foo对象创建的决定是在编译时作出。例如,如果您在Win32平台上编译,你只想创建Win32Foo对象,如果编译OSX上只想要创建OSXFoo对象等。但是,其具体Bar对象来创建在运行时做出的决定,基于密钥的字符串。

现在,我的问题是关于实施这一计划的最好方式。一种方法我想出使用常规的工厂:

shared_ptr<FooInterface> foo = FooFactory::create();
shared_ptr<BarInterface> happyBar = BarFactory::create("Happy");
shared_ptr<BarInterface> sadBar = BarFactory::create("Sad");

另一种方法是使用我称之为“自我工厂”:

shared_ptr<FooInterface> foo = FooInterface::create();
shared_ptr<BarInterface> happyBar = BarInterface::create("Happy");
shared_ptr<BarInterface> sadBar = BarInterface::create("Sad");

什么都从可用性的角度来看和从架构的观点来看?

的优点和每一种方法的缺点,
有帮助吗?

解决方案

工厂有两个常见用途:

1)决定在运行时,动态多态型基于参数和/或全局状态(例如配置)。你的模式来实现的。

2)依赖注入:而不是使用一个静态函数来创建对象,使用工厂的对象,以使对象的类型返回可以由呼叫者进行配置,通过使在任何工厂它们想。两种模式都提供了这一点。此外,第二个图案甚至不允许静态依赖注入(通过具有采取一个工厂类作为模板参数模板函数),因为接口和工厂是相同的。

所以你的模式(以及你经常工厂)的一个con是不是真正支持了依赖注入。有一个且只有一个函数调用来得到一个对象,这是一个FooInterface,那就是FooInterface ::创建()。我不认为为什么依赖注入是非常有用的,只是指出,如果你建立这样,你就不能使用它。

其他提示

我会做的改进:

shared_ptr<FooInterface> foo = Factory<FooInterface>::create();
shared_ptr<BarInterface> happyBar = Factory<BarInterface>::create("Happy");
shared_ptr<BarInterface> sadBar = Factory<BarInterface>::create("Sad");

您会声明:

template <class I>
struct Factory { };

然后对每个需要一个工厂接口,你可以这样做:

template <>
struct Factory<FooInterface>
{
    static FooInterface create();
};

这可以让你保持工厂实现从接口声明分开,但仍使用类型系统在编译时将它们绑定。

一般工厂负责创建整个类层次结构的对象。因此,在您的例子中,你将有一个Win32Factory,OSXFactory等等这样做的好处是,你必须选择具体实施的(Win32 / UNIX /等)只有一次 - 工厂创建过程中,但如果您使用的类的接口,你有供给OS信息的所有时间。

如果你只有两个类(Foo和Bar)我不知道,是否值得为他们创造工厂的努力,而不是仅仅使用接口的create方法。

哦,当接口具有用于创建它的类型的对象的方法,它被称为工厂方法图案

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top