工厂的声明并向其传递参数以初始化它创建的对象
Factory's claims and passing it arguments to initialize objects it creates
工厂模式带来了两个主要的东西:
- 将客户端代码与类的确切实现细节分离。
- 集中代码创建,因此如果创建逻辑发生更改,则仅在工厂中更改,而不是可能的 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
的客户端代码仍然需要重新编译和重新部署。在这种情况下,第一工厂虽然可读性较差,但效果更好。
因此,工厂的选择取决于代码更改的可能性。请记住保持工厂界面稳定。
相关文章:
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- GLEW/GLUT:调用init并创建一个窗口后,取消初始化并重新初始化?
- 如何同时创建一个具有两个或多个构造函数初始化的对象
- 使用函数从 Visual Studio 2017 中的 main 创建和初始化数组
- 设置 JVM 通过 JNI 初始化时创建的线程数
- 当 map 是一个整数数组并且由 operator[] 创建时,它是否初始化其映射类型
- 创建 std::thread 时出现错误 C2280,未在 C++ 中初始化
- 为什么调用 cout.operator<<(const char*) 打印地址而不是字符串? 如何创建一个函数本地静态"HashSet<char>"并初始化它一次?
- 在成员初始化列表中,我可以创建对列表中不在列表中的成员变量的引用
- 从现有 istream 或类本身创建的 istream 初始化成员 istream
- 无序列图会创建一个零初始化结构吗?
- 可以使用C 结构汇总初始化来创建临时实例
- 在此初始化中创建的临时对象数
- 当我初始化了指针属性 allready 时,如何将 QGraphicsItem 向下投射到创建的类?
- MPI - 当数组初始化值必须为常量时,如何为工作线程创建部分数组
- 如何正确创建、初始化和访问类的静态成员
- C++ 在堆上创建数组而不对其进行初始化
- 在c++上创建税务计算程序,错误为未初始化的局部变量
- 如何创建一个编译时静态类类型,该类型初始化具有特定值的成员容器
- 未初始化的值是由堆分配创建的:Unordered_map