我不知道这个有没有正式的名称,但我一直在玩我喜欢称之为“自我工厂”的模式。基本上,这是一个抽象基类充当自己的工厂的时候。让我解释:
我的系统中有 Foo 对象和 Bar 对象,它们通过接口 FooInterface 和 BarInterface 使用。我需要为我的客户提供正确类型的 Foo 和 Bar。在编译时决定创建哪个具体的 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");
从可用性的角度和架构的角度来看,每种方法的优缺点是什么?