抽象工厂的初次尝试 ((15c++ Homework) polymorphic and OOP design pattern Abstract Factory)

  首先介绍我通过这题所理解的抽象工厂:所谓抽象工厂,就是把一些类看做工厂类,专门用来new产品类,而产品类所要实现的就是构造函数,和一些简单的方法。这种写法的好处在于,有效地提高了代码的封装性,符合面向对象的需求。

下面是题目的代码。


Client.cpp

#include <iostream>
#include <string>
 
#include "Factory.hpp"
#include "Product.hpp"
 
int main() {
  UIFactory* ui = 0;
 
  int choose;
 
  std::cin >> choose;
 
  switch (choose) {
    case 0:
      ui = new MFCUIFactory();
      break;
    case 1:
      ui = new GtkUIFactory();
      break;
    case 2:
    default:
      ui = new QtUIFactory();
  }
 
  /* Use the factory to build interface. */
  Window* toolbox = ui->getToolboxWindow();
  Window* layers = ui->getLayersWindow();
  Window* main = ui->getMainWindow();
 
  /* See what have we recieved. */
  std::cout << toolbox->getToolkit() << ":" << toolbox->getType() << std::endl;
  std::cout << layers->getToolkit() << ":" << layers->getType() << std::endl;
  std::cout << main->getToolkit() << ":" << main->getType() << std::endl;
 
  ui->deleteWindow(toolbox);
  ui->deleteWindow(layers);
  ui->deleteWindow(main);
 
  delete ui;
}


从中可以分辨出, Window这个类,明显是通过其他类的方法所生成的,那么Window这个类就是产品类(Product),而生成它的类,就是工厂类(factory)


factory,hpp

#ifndef FACTORY
#define FACTORY
#include "Product.hpp"
 
class UIFactory {
 public:
  virtual Window* getToolboxWindow() = 0;
  virtual Window* getLayersWindow() = 0;
  virtual Window* getMainWindow() = 0;
  void deleteWindow(Window* w) {
    if (w != NULL) {
      delete w;
    }
  }
};
 
/* Factory for Gtk toolkit */
class GtkUIFactory : public UIFactory {
 public:
  Window* getToolboxWindow() { return new GtkToolboxWindow(); }
  Window* getLayersWindow() { return new GtkLayersWindow(); }
  Window* getMainWindow() { return new GtkMainWindow(); }
};
 
/* Factory for Qt toolkit */
class QtUIFactory : public UIFactory {
 public:
  Window* getToolboxWindow() { return new QtToolboxWindow(); }
  Window* getLayersWindow() { return new QtLayersWindow(); }
  Window* getMainWindow() { return new QtMainWindow(); }
};
 
/* Factory for MFC toolkit */
class MFCUIFactory : public UIFactory {
 public:
  Window* getToolboxWindow() { return new MFCToolboxWindow(); }
  Window* getLayersWindow() { return new MFCLayersWindow(); }
  Window* getMainWindow() { return new MFCMainWindow(); }
};
 
#endif

Product.hpp

#ifndef PRODUCT
#define PRODUCT
 
#include <iostream>
#include <string>
 
class Window {
 protected:
  int width;
  int height;
  std::string toolkit;
  std::string type;
 
  Window(std::string usedToolkit, std::string windowType)
      : toolkit(usedToolkit), type(windowType) {}
 
 public:
  virtual ~Window() {}
  std::string getToolkit() { return toolkit; }
  std::string getType() { return type; }
};
 
class GtkToolboxWindow : public Window {
 public:
  GtkToolboxWindow() : Window("Gtk", "ToolboxWindow") {}
};
 
class GtkLayersWindow : public Window {
 public:
  GtkLayersWindow() : Window("Gtk", "LayersWindow") {}
};
 
class GtkMainWindow : public Window {
 public:
  GtkMainWindow() : Window("Gtk", "MainWindow") {}
};
 
class QtToolboxWindow : public Window {
 public:
  QtToolboxWindow() : Window("Qt", "ToolboxWindow") {}
};
 
class QtLayersWindow : public Window {
 public:
  QtLayersWindow() : Window("Qt", "LayersWindow") {}
};
 
class QtMainWindow : public Window {
 public:
  QtMainWindow() : Window("Qt", "MainWindow") {}
};
 
class MFCToolboxWindow : public Window {
 public:
  MFCToolboxWindow() : Window("MFC", "ToolboxWindow") {}
};
 
class MFCLayersWindow : public Window {
 public:
  MFCLayersWindow() : Window("MFC", "LayersWindow") {}
};
 
class MFCMainWindow : public Window {
 public:
  MFCMainWindow() : Window("MFC", "MainWindow") {}
};
 
#endif


以上是+7大神的十分透彻的代码, 但是一开始我对这个的理解不透彻,故此只是实现了功能,但是没有体现出抽象工厂,毕竟提前了太多。


一下是我的实现方法


My.hpp

#include <iostream>
using namespace std;
class Window {
    public:
    string kit;
    string type;
    Window(string _kit, string _type) {
        kit = _kit;
        type = _type;
    }
    string getToolkit() {return kit;}
    string getType() {return type;}
};
class UIFactory {
    public:
    virtual Window* getToolboxWindow() =0;
    virtual Window* getLayersWindow() =0;
    virtual Window* getMainWindow() =0;
    void deleteWindow(Window *type) {
        delete type;
    }
};
class MFCUIFactory : public UIFactory {
    virtual Window* getToolboxWindow() {
        Window* a = new Window("MFC", "ToolboxWindow");
        return a;
    }
    virtual Window* getLayersWindow() {
        Window* a = new Window("MFC", "LayersWindow");
        return a;
    }
    virtual Window* getMainWindow() {
        Window* a = new Window("MFC", "MainWindow");
        return a;
    }
};
class GtkUIFactory : public UIFactory {
    virtual Window* getToolboxWindow() {
        Window* a = new Window("Gtk", "ToolboxWindow");
        return a;
    }
    virtual Window* getLayersWindow() {
        Window* a = new Window("Gtk", "LayersWindow");
        return a;
    }
    virtual Window* getMainWindow() {
        Window* a = new Window("Gtk", "MainWindow");
        return a;
    }
};
class QtUIFactory : public UIFactory {
    virtual Window* getToolboxWindow() {
        Window* a = new Window("Qt", "ToolboxWindow");
        return a;
    }
    virtual Window* getLayersWindow() {
        Window* a = new Window("Qt", "LayersWindow");
        return a;
    }
    virtual Window* getMainWindow() {
        Window* a = new Window("Qt", "MainWindow");
        return a;
    }
};

我的代码不够优美, 很多地方可以直接一句 return new Window("xxx", "xxx"); 

可以解决的,但是多写了一些。


总的来说这题不难,主要是在于掌握抽象工厂的概念。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值