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

Factory's claims and passing it arguments to initialize objects it creates

本文关键字:初始化 创建 对象 参数 声明 工厂      更新时间:2023-10-16

工厂模式带来了两个主要的东西:

  • 将客户端代码与类的确切实现细节分离。
  • 集中代码创建,因此如果创建逻辑发生更改,则仅在工厂中更改,而不是可能的 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);
    }
}

这取决于使用情况。

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

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

工厂模式的要点是通过公开稳定的接口在创建对象时隐藏易失性的东西。你的两个工厂都隐藏了Dog & Cat 的类型,并公开了抽象类型Animal。这很好。

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

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

相关文章: