工厂声明并传递参数以初始化它创建的对象

时间:2016-02-26 06:41:22

标签: c++ design-patterns factory

工厂模式带来两个主要内容:

  • 将客户端代码与类的确切实现细节分离。
  • 集中创建代码,因此如果创建逻辑发生更改,则仅在工厂中更改,而不是可能的20个文件。

但是,如果我想将特定参数传递给构造函数以正确初始化它,该怎么办?这将来自应用程序的用户或当前状态。难道这种失败不是第二点吗?

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);
    }
}

2 个答案:

答案 0 :(得分:0)

这取决于使用情况。

无论如何,在第二个版本中,我没有看到直接调用构造函数的好处 似乎唯一的好处就是能够将这些功能放入map

在第一个版本中,地图可以是facory方法的实现细节。

答案 1 :(得分:0)

工厂模式的重点在于通过暴露稳定的界面来创建对象时隐藏易变的东西。你的两个工厂都隐藏了Dog和& Cat,并公开抽象类型Animal。这很好。

第二个工厂更具可读性,但如果它的界面发生变化怎么办?例如,当您添加新方法createElephant时,某些不关心Elephant的客户端代码仍需要重新编译和重新部署。在这种情况下,第一家工厂虽然不太可读,但效果更好。

因此,工厂的选择取决于代码更改的可能性。请记住保持工厂界面稳定。