动机

  • 在软件系统中,经常面临着创建对象的工作,由于需求的变化,需要创建的对象的具体类型经常变化。
  • 如何应对这种变化?如何绕开常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“具体对象创建工作”的紧耦合?

    模式定义

    定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到子类(目的:解耦,手段:虚函数)

    未使用该设计模式

    ```cpp class ISplitter { public: virtual void Split() = 0; virtual ~ISplitter() {} }; class BinarySplitter : public ISplitter { };

class txtSplitter : public ISplitter {

};

class PictureSplitter : public ISplitter {

};

class VideoSplitter : public ISplitter {

};

class MainForm { public: void Button1_Click() { //new BinarySplitter是依赖具体类,违背了依赖倒置原则 ISplitter* splitter = new BinarySplitter(filePath, number);

  1. splitter.split();
  2. }

};

  1. <a name="lFuk7"></a>
  2. ### 实现1
  3. ```cpp
  4. class SplitterFactory{
  5. public:
  6. virtual ISplitter* CreateSplitter() = 0;
  7. virtual ~SplitterFactory() {}
  8. };
  9. class ISplitter
  10. {
  11. public:
  12. virtual void Split() = 0;
  13. virtual ~ISplitter() {}
  14. };
  15. class BinarySplitter : public ISplitter
  16. {
  17. };
  18. class BinarySplitterFactory : public SplitterFactory
  19. {
  20. public:
  21. ISplitter* CreateSplitter() {
  22. return new BinarySplitter();
  23. }
  24. };
  25. class txtSplitter : public ISplitter
  26. {
  27. };
  28. class txtSplitterFactory : public SplitterFactory
  29. {
  30. public:
  31. ISplitter* CreateSplitter() {
  32. return new txtSplitter();
  33. }
  34. };
  35. class PictureSplitter : public ISplitter
  36. {
  37. };
  38. class PictureSplitterFactory : public SplitterFactory
  39. {
  40. public:
  41. ISplitter* CreateSplitter() {
  42. return new PictureSplitter();
  43. }
  44. };
  45. class VideoSplitter : public ISplitter
  46. {
  47. };
  48. class VideoSplitterFactory : public SplitterFactory
  49. {
  50. public:
  51. ISplitter* CreateSplitter() {
  52. return new VideoSplitter();
  53. }
  54. };
  55. class MainForm
  56. {
  57. SplitterFactory* factory;
  58. public:
  59. MainForm(SplitterFactory* factory) { //根据传入的参数创建不同的工厂
  60. this->factory = factory;
  61. }
  62. void Button1_Click() {
  63. ISplitter* splitter = factory->CreateSplitter(); //多态new
  64. splitter.split();
  65. }
  66. };

面向对象的松耦合设计不是将依赖具体的类给消灭掉,而是实际上将变换赶到某个局部。