zoukankan      html  css  js  c++  java
  • 学习笔记——抽象工厂模式Abstract Factory

    在工厂模式的基础上,通过为工厂类增加接口,实现其他产品的生产,而不用一类产品就增加一个工厂。

    依然以《真菌世界》游戏故事类比,树作为工厂,如果现在有两类树,一类生产快速弄真菌飞机和20毫米炮,一类生产慢速弄真菌飞机和10毫米炮。

    产品类:

    真菌飞机接口

    IFungus.h

    1 #pragma once
    2 class IFungus
    3 {
    4 public:
    5     IFungus(void);
    6     virtual ~IFungus(void);
    7 public:
    8     virtual void Fight()=0;
    9 };

    IFungus.cpp

     1 #include "IFungus.h"
     2 
     3 
     4 IFungus::IFungus(void)
     5 {
     6 }
     7 
     8 
     9 IFungus::~IFungus(void)
    10 {
    11 }

    真菌飞机A

    FungusA.h

     1 #pragma once
     2 #include "ifungus.h"
     3 class CFungusA :
     4     public IFungus
     5 {
     6 public:
     7     CFungusA(void);
     8     ~CFungusA(void);
     9 public:
    10     void Fight();
    11 };

    FungusA.cpp

     1 #include "FungusA.h"
     2 #include <iostream>
     3 
     4 CFungusA::CFungusA(void)
     5 {
     6 }
     7 
     8 
     9 CFungusA::~CFungusA(void)
    10 {
    11 }
    12 
    13 void CFungusA::Fight()
    14 {
    15     std::cout<<"快速攻击型"<<std::endl;
    16 }

    真菌飞机B

    FungusB.h

     1 #pragma once
     2 #include "ifungus.h"
     3 class CFungusB :
     4     public IFungus
     5 {
     6 public:
     7     CFungusB(void);
     8     ~CFungusB(void);
     9 public:
    10     void Fight();
    11 };

    FungusB.cpp

     1 #include "FungusB.h"
     2 #include <iostream>
     3 
     4 CFungusB::CFungusB(void)
     5 {
     6 }
     7 
     8 
     9 CFungusB::~CFungusB(void)
    10 {
    11 }
    12 
    13 void CFungusB::Fight()
    14 {
    15     std::cout<<"慢慢攻击型"<<std::endl;
    16 }

    炮接口

    ICannon.h

    1 #pragma once
    2 class ICannon
    3 {
    4 public:
    5     ICannon(void);
    6     virtual ~ICannon(void);
    7 public:
    8     virtual void Fire() = 0;
    9 };

    ICannon.cpp

     1 #include "ICannon.h"
     2 
     3 
     4 ICannon::ICannon(void)
     5 {
     6 }
     7 
     8 
     9 ICannon::~ICannon(void)
    10 {
    11 }

    炮A

    CannonA.h

     1 #pragma once
     2 #include "icannon.h"
     3 class CCannonA :
     4     public ICannon
     5 {
     6 public:
     7     CCannonA(void);
     8     ~CCannonA(void);
     9 public:
    10     void Fire();
    11 };

    CannonA.cpp

     1 #include "CannonA.h"
     2 #include <iostream>
     3 
     4 CCannonA::CCannonA(void)
     5 {
     6 }
     7 
     8 
     9 CCannonA::~CCannonA(void)
    10 {
    11 }
    12 
    13 void CCannonA::Fire()
    14 {
    15     std::cout<<"使用10毫米弹"<<std::endl;
    16 }

    炮B

    CannonB.h

     1 #pragma once
     2 #include "icannon.h"
     3 class CCannonB :
     4     public ICannon
     5 {
     6 public:
     7     CCannonB(void);
     8     ~CCannonB(void);
     9 public:
    10     void Fire();
    11 };

    CannonB.cpp

     1 #include "CannonB.h"
     2 #include <iostream>
     3 
     4 CCannonB::CCannonB(void)
     5 {
     6 }
     7 
     8 
     9 CCannonB::~CCannonB(void)
    10 {
    11 }
    12 
    13 void CCannonB::Fire()
    14 {
    15     std::cout<<"使用20毫米弹"<<std::endl;
    16 }

    工厂类:

    树接口

    ITree.h

     1 #pragma once
     2 #include "IFungus.h"
     3 #include "ICannon.h"
     4 
     5 class ITree
     6 {
     7 public:
     8     ITree(void);
     9     virtual ~ITree(void);
    10 public:
    11     virtual IFungus* GetFungus() = 0;
    12     virtual ICannon* GetCannon() = 0;
    13 };

    ITree.cpp

     1 #include "ITree.h"
     2 
     3 
     4 ITree::ITree(void)
     5 {
     6 }
     7 
     8 
     9 ITree::~ITree(void)
    10 {
    11 }

    树A

    TreeA.h

     1 #pragma once
     2 #include "itree.h"
     3 class CTreeA :
     4     public ITree
     5 {
     6 public:
     7     CTreeA(void);
     8     ~CTreeA(void);
     9 public:
    10     IFungus* GetFungus();
    11     ICannon* GetCannon();
    12 };

    TreeB.cpp

     1 #include "TreeA.h"
     2 #include "FungusA.h"
     3 #include "CannonB.h";
     4 
     5 CTreeA::CTreeA(void)
     6 {
     7 }
     8 
     9 
    10 CTreeA::~CTreeA(void)
    11 {
    12 }
    13 
    14 IFungus* CTreeA::GetFungus()
    15 {
    16     return new CFungusA();
    17 }
    18 
    19 ICannon* CTreeA::GetCannon()
    20 {
    21     return new CCannonB();
    22 }

    树B

    TreeB.h

     1 #pragma once
     2 #include "itree.h"
     3 class CTreeB :
     4     public ITree
     5 {
     6 public:
     7     CTreeB(void);
     8     ~CTreeB(void);
     9 public:
    10     IFungus* GetFungus();
    11     ICannon* GetCannon();
    12 };

    TreeB.cpp

     1 #include "TreeB.h"
     2 #include "FungusB.h"
     3 #include "CannonA.h"
     4 
     5 CTreeB::CTreeB(void)
     6 {
     7 }
     8 
     9 
    10 CTreeB::~CTreeB(void)
    11 {
    12 }
    13 
    14 IFungus* CTreeB::GetFungus()
    15 {
    16     return new CFungusB();
    17 }
    18 
    19 ICannon* CTreeB::GetCannon()
    20 {
    21     return new CCannonA();
    22 }

    场景

    main.cpp

     1 #include "ITree.h"
     2 #include "TreeA.h"
     3 #include "TreeB.h"
     4 
     5 int main()
     6 {
     7     ITree* pTreeA = new CTreeA();
     8     ITree* pTreeB = new CTreeB();
     9 
    10     pTreeA->GetFungus()->Fight();
    11     pTreeA->GetCannon()->Fire();
    12 
    13     pTreeB->GetFungus()->Fight();
    14     pTreeB->GetCannon()->Fire();
    15 
    16     delete pTreeB;
    17     delete pTreeA;
    18 
    19     return 0;
    20 }

    如果又有了其他类型的真菌飞机和炮,我们扩展相应的类型,然后创立相应的工厂(树)进行组合生产就行了。

    其实很想通过构造函数传参数,通过参数来决定生产的是什么,但是这样的话,总觉得侵入式方法破坏了工厂类的自主权,干涉了这种设计模式的目的:不用关心具体产品,只要知道哪个工厂生产什么就行。

  • 相关阅读:
    关于Maya Viewport 2.0 API 开发的介绍视频
    春节大假
    Some tips about the life cycle of Maya thread pool
    Can I compile and run Dx11Shader for Maya 2015 on my side?
    How to get current deformed vertex positions in MoBu?
    想加入全球首届的 欧特克云加速计划吗?
    三本毕业(非科班),四次阿里巴巴面试,终拿 offer(大厂面经)
    mac、window版编辑器 webstorm 2016... 永久破解方法。
    node 搭载本地代理,处理web本地开发跨域问题
    js 一维数组,转成嵌套数组
  • 原文地址:https://www.cnblogs.com/dev2007/p/3419611.html
Copyright © 2011-2022 走看看