工厂模式带来两个主要内容:
但是,如果我想将特定参数传递给构造函数以正确初始化它,该怎么办?这将来自应用程序的用户或当前状态。难道这种失败不是第二点吗?
class AnimalFactory
{
public:
createAnimal(type, string nickName)
{
if (type == 0)
return new Dog(nickName);
else if(type == 1)
return new Cat(nickName);
}
}
以上是我在示例中看到的,但是以下同样优秀的工厂,可能更优选,因为它更具可读性并且传递少一个参数?
class AnimalFactory
{
public:
createDog(string nickName)
{
return new Dog(nickName);
}
createCat(string nickName)
{
return new Cat(nickName);
}
}
答案 0 :(得分:0)
这取决于使用情况。
无论如何,在第二个版本中,我没有看到直接调用构造函数的好处
似乎唯一的好处就是能够将这些功能放入map
。
在第一个版本中,地图可以是facory方法的实现细节。
答案 1 :(得分:0)
工厂模式的重点在于通过暴露稳定的界面来创建对象时隐藏易变的东西。你的两个工厂都隐藏了Dog
和& Cat
,并公开抽象类型Animal
。这很好。
第二个工厂更具可读性,但如果它的界面发生变化怎么办?例如,当您添加新方法createElephant
时,某些不关心Elephant
的客户端代码仍需要重新编译和重新部署。在这种情况下,第一家工厂虽然不太可读,但效果更好。
因此,工厂的选择取决于代码更改的可能性。请记住保持工厂界面稳定。