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

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

产品类:

真菌飞机接口

IFungus.h

 #pragma once
class IFungus
{
public:
IFungus(void);
virtual ~IFungus(void);
public:
virtual void Fight()=;
};

IFungus.cpp

 #include "IFungus.h"

 IFungus::IFungus(void)
{
} IFungus::~IFungus(void)
{
}

真菌飞机A

FungusA.h

 #pragma once
#include "ifungus.h"
class CFungusA :
public IFungus
{
public:
CFungusA(void);
~CFungusA(void);
public:
void Fight();
};

FungusA.cpp

 #include "FungusA.h"
#include <iostream> CFungusA::CFungusA(void)
{
} CFungusA::~CFungusA(void)
{
} void CFungusA::Fight()
{
std::cout<<"快速攻击型"<<std::endl;
}

真菌飞机B

FungusB.h

 #pragma once
#include "ifungus.h"
class CFungusB :
public IFungus
{
public:
CFungusB(void);
~CFungusB(void);
public:
void Fight();
};

FungusB.cpp

 #include "FungusB.h"
#include <iostream> CFungusB::CFungusB(void)
{
} CFungusB::~CFungusB(void)
{
} void CFungusB::Fight()
{
std::cout<<"慢慢攻击型"<<std::endl;
}

炮接口

ICannon.h

 #pragma once
class ICannon
{
public:
ICannon(void);
virtual ~ICannon(void);
public:
virtual void Fire() = ;
};

ICannon.cpp

 #include "ICannon.h"

 ICannon::ICannon(void)
{
} ICannon::~ICannon(void)
{
}

炮A

CannonA.h

 #pragma once
#include "icannon.h"
class CCannonA :
public ICannon
{
public:
CCannonA(void);
~CCannonA(void);
public:
void Fire();
};

CannonA.cpp

 #include "CannonA.h"
#include <iostream> CCannonA::CCannonA(void)
{
} CCannonA::~CCannonA(void)
{
} void CCannonA::Fire()
{
std::cout<<"使用10毫米弹"<<std::endl;
}

炮B

CannonB.h

 #pragma once
#include "icannon.h"
class CCannonB :
public ICannon
{
public:
CCannonB(void);
~CCannonB(void);
public:
void Fire();
};

CannonB.cpp

 #include "CannonB.h"
#include <iostream> CCannonB::CCannonB(void)
{
} CCannonB::~CCannonB(void)
{
} void CCannonB::Fire()
{
std::cout<<"使用20毫米弹"<<std::endl;
}

工厂类:

树接口

ITree.h

 #pragma once
#include "IFungus.h"
#include "ICannon.h" class ITree
{
public:
ITree(void);
virtual ~ITree(void);
public:
virtual IFungus* GetFungus() = ;
virtual ICannon* GetCannon() = ;
};

ITree.cpp

 #include "ITree.h"

 ITree::ITree(void)
{
} ITree::~ITree(void)
{
}

树A

TreeA.h

 #pragma once
#include "itree.h"
class CTreeA :
public ITree
{
public:
CTreeA(void);
~CTreeA(void);
public:
IFungus* GetFungus();
ICannon* GetCannon();
};

TreeB.cpp

 #include "TreeA.h"
#include "FungusA.h"
#include "CannonB.h"; CTreeA::CTreeA(void)
{
} CTreeA::~CTreeA(void)
{
} IFungus* CTreeA::GetFungus()
{
return new CFungusA();
} ICannon* CTreeA::GetCannon()
{
return new CCannonB();
}

树B

TreeB.h

 #pragma once
#include "itree.h"
class CTreeB :
public ITree
{
public:
CTreeB(void);
~CTreeB(void);
public:
IFungus* GetFungus();
ICannon* GetCannon();
};

TreeB.cpp

 #include "TreeB.h"
#include "FungusB.h"
#include "CannonA.h" CTreeB::CTreeB(void)
{
} CTreeB::~CTreeB(void)
{
} IFungus* CTreeB::GetFungus()
{
return new CFungusB();
} ICannon* CTreeB::GetCannon()
{
return new CCannonA();
}

场景

main.cpp

 #include "ITree.h"
#include "TreeA.h"
#include "TreeB.h" int main()
{
ITree* pTreeA = new CTreeA();
ITree* pTreeB = new CTreeB(); pTreeA->GetFungus()->Fight();
pTreeA->GetCannon()->Fire(); pTreeB->GetFungus()->Fight();
pTreeB->GetCannon()->Fire(); delete pTreeB;
delete pTreeA; return ;
}

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

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

学习笔记——抽象工厂模式Abstract Factory的更多相关文章

  1. 设计模式学习心得<抽象工厂模式 Abstract Factory>

    抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在抽 ...

  2. 设计模式 笔记 抽象工厂模式 Abstract Factory

    //---------------------------15/04/09---------------------------- //Abstract Factory 抽象工厂----对象创建型模式 ...

  3. .NET设计模式(2):1.2 抽象工厂模式(Abstract Factory)

    概述 抽象工厂模式(Abstract Factory)是所有形态的工厂模式中最为抽象和最具一般性的一种形态.抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽象工厂模式可以向客户端提供一个接口 ...

  4. 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

    原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...

  5. C#学习笔记-抽象工厂模式

    题目1:数据访问,通过数据库对用户表单的进行访问,数据库包含SQL Server,对用户表单进行“新增用户”和“查询用户”信息等操作. 分析: 首先,确认用户表单,里面包含两个ID和Name两个字段, ...

  6. 【设计模式】抽象工厂模式 Abstract Factory Pattern

    简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式 ...

  7. 设计模式 - 抽象工厂模式(abstract factory pattern) 具体解释

    抽象工厂模式(abstract factory pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/2709 ...

  8. 抽象工厂模式(Abstract Factory)C#实例

    抽象工厂模式(Abstract Factory)C#实例 本文出处http://www.dofactory.com/net/abstract-factory-design-pattern 一.场景描述 ...

  9. 二十四种设计模式:抽象工厂模式(Abstract Factory Pattern)

    抽象工厂模式(Abstract Factory Pattern) 介绍提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 示例有Message和MessageModel,Messag ...

随机推荐

  1. 不要在 _ASSERT() 宏中执行功能代码 AND RELEASE版调试办法

            程序在DEBUG版正常运行,在RELEASE版就崩溃了,想调试找问题,却发现RELEASE版根本走不到断点... 需要在工程配置中将 Configuration Properties- ...

  2. 第三次冲刺spring会议(第五次会议)

    [例会时间]2014/5/24 21:15 [例会地点]9#446 [例会形式]轮流发言 [例会主持]马翔 [例会记录]兰梦 小组成员:兰梦 ,马翔,李金吉,赵天,胡佳奇

  3. windows7旗舰版系统自带组件IIS搭建ftp

    1.win7,”开始“,打开”控制面板“,点击”程序“,看到”程序和功能“,如图所示: 2.点击”打开或关闭Windows功能“,如图所示: 3.成功后,打开”控制面板“,点击”系统和安全“,点击”管 ...

  4. G - Zombie’s Treasure Chest(动态规划专项)

    G - Zombie’s Treasure Chest Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d &am ...

  5. 588. [NOIP1999] 拦截导弹

    588. [NOIP1999] 拦截导弹 ★  输入文件:missile.in  输出文件:missile.out  简单对比 时间限制:1 s 内存限制:128 MB 题目描述 某国为了防御敌国的导 ...

  6. javascript显式类型的转换

    显式类型转换目的:为了使代码变得清晰易读,而做显示类型的转换常使用的函数:Boolean(),String(),Number()或Object()如:Nunber(5) //5String(true) ...

  7. 总结一下C++各个版本之间的功能扩充

    活到老,学到老.   C++ 98 我们学习和教材中常见的. C++ 03 主要是对98版本进行了bug修复. C++ 11 引入的新功能请参见:         http://www.cpluspl ...

  8. Android上的远程调试

    来源: http://www.seejs.com/archives/296 目录 远程调试概述 使用 Chrome 的 ADB 扩展进行远程调试 1. 安装 ADB 扩展 2. 启用你的移动设备上的 ...

  9. MyBatis 基本数据类型条件判断问题

    1.判断参数使用:_parameter <select id="findCount" parameterType="int" resultType=&qu ...

  10. css3-多列显示文字

    -------------------------- <style>            #demo{                margin: 20px auto;         ...