zoukankan      html  css  js  c++  java
  • gof设计模式——抽象工厂 c++实现

          最近抽空看了看gof的设计模式,感觉理解上有一定难度,而且即使看的时候理解了,用的时候也忘了,为了加深印象,把书上的一个应用场景用c++实现一下,因为平时较少用设计模式,理解上难免有误,错误之处望指正,不胜感激。

    意图

        提供一个创建一系列相关活相互依赖对象的接口,而无需指定他们具体的类

        个人理解:不暴露所用组件的具体实现,只提供使用相关类的接口,可维护性强。

    实用性

    •     一个系统要独立于它的产品的创建、组合和表示时。
    •     有一个系统要有多个产品系列中的一个来配置时。
    •     当你要强调一系列相关的产品对象的设计以便进行联合使用时。
    •     当你提供一个产品类库,而只想显示它们的接口而不是实现时。

    结构 

     抽象工厂

    ps:要画图的时候发现没装visio,用Diagram Designer画的,画的很挫,但是清晰一点,也和下面的程序对应,网上找的图有点模糊。

    实现

     

    抽象工厂c++实现
    1 /* 抽象工厂 shapherd */
    2
    3 #include<iostream>
    4 using namespace std;
    5
    6 class Window {
    7 public:
    8 virtual ~Window() {}
    9 //virtual ~Window() = 0;
    10 };
    11
    12 class PMWindow : public Window {
    13 public:
    14 PMWindow()
    15 {
    16 cout<<"PMWindow created"<<endl;
    17 }
    18 };
    19 class MotifWindow : public Window {
    20 public:
    21 MotifWindow()
    22 {
    23 cout<<"motifWindow created"<<endl;
    24 }
    25 };
    26
    27 class ScrollBar{
    28 public:
    29 virtual ~ScrollBar() {}
    30 };
    31
    32 class PMScrollBar : public ScrollBar {
    33 public:
    34 PMScrollBar()
    35 {
    36 cout<<"PMScrollbar created"<<endl;
    37 }
    38 };
    39 class MotifScrollBar : public ScrollBar {
    40 public:
    41 MotifScrollBar()
    42 {
    43 cout<<"MotifScrollbar created " <<endl;
    44 }
    45 };
    46
    47 class WidgetFactory {
    48 public:
    49 virtual ~WidgetFactory() {}
    50 virtual ScrollBar* CreatScrollBar() = 0;
    51 virtual Window* CreatWindow() = 0;
    52 };
    53
    54 class PMWidgetFactory : public WidgetFactory {
    55 ScrollBar* CreatScrollBar()
    56 {
    57 return new PMScrollBar;
    58 }
    59 Window* CreatWindow()
    60 {
    61 return new PMWindow;
    62 }
    63 };
    64 class MotifWidgetFactory : public WidgetFactory {
    65 ScrollBar* CreatScrollBar()
    66 {
    67 return new MotifScrollBar;
    68 }
    69 Window* CreatWindow()
    70 {
    71 return new MotifWindow;
    72 }
    73 };
    74
    75 int main(int argc, char* argv[])
    76 {
    77 WidgetFactory *wfOfPM = new PMWidgetFactory();
    78 wfOfPM->CreatWindow();
    79 wfOfPM->CreatScrollBar();
    80 delete wfOfPM;
    81 WidgetFactory *wfOfMotif = new MotifWidgetFactory();
    82 wfOfMotif->CreatWindow();
    83 wfOfMotif->CreatScrollBar();
    84 delete wfOfMotif;
    85 }
    86

    遇到的问题

    1.  因为好久没用vim了,忘记了用管理员权限创建文件,结果乱写一气,写完了用wq肯定是不能保存的,在上面点右键copy也不可用,linux方面不太熟悉,纠结了半天,最后查到一个命令 w ! sudo tee %
    2. 积累没有实例化,但是析构函数生命为纯虚函数就报错, virtual ~Window() = 0;这句在linux下会报 undefined reference to `Window::~Window()' 错误,在windows会报error LNK2019: unresolved external symbol "public: virtual __thiscall Window::~Window(void)"错误,无奈之下仅能声明为虚函数了。我怀疑是不是因为工厂类里面返回了Window* 指针,但是这也不是实例化Window类啊,求解!
  • 相关阅读:
    解密时遇到 填充无效 无法被移除
    固态硬盘SSD,机械硬盘HDD,4K速度对比。
    onsubmit ajax return false 无效
    chrome flash
    ubuntu base make 未找到命令
    winrar 压缩命令
    查看耗时长,CPU 100% 的SQL
    【转】SQL Server日志文件过大 大日志文件清理方法 不分离数据库
    安装老版本redis .NET 客户端
    python2.0_day22_web聊天室二
  • 原文地址:https://www.cnblogs.com/shapherd/p/abstractfactory.html
Copyright © 2011-2022 走看看