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

依然以《真菌世界》游戏故事类比,树作为工厂,如果现在有两类树,一类生产快速弄真菌飞机和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. 找斐波那契数列中的第N个数——递归与函数自调用算法

    题目描述 Description 用递归的方法求斐波那契数列中的第N个数 输入输出格式 Input/output 输入格式:一行,一个正整数n输出格式: 一行,一个数,表示斐波那契数列中的第N个数  ...

  2. MySQL binlog 查看信息

    1)按时间筛选 mysqlbinlog --start-datetime="2009-09-14 0:20:00" --stop-datetim="2009-09-15 ...

  3. K - Balance(动态规划专项)

    K - Balance Time Limit:1000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u Submit  ...

  4. 3. Shell 基本运算符

    1. 概述 1.1 Shell 支持多种运算符,包括以下几种 算数运算符 关系运算符 布尔运算符 字符串运算符 文件测试运算符 1.2 原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例 ...

  5. HDU 5798 Stabilization

    方法太厉害了....看了官方题解的做法....然后...想了很久很久才知道他想表达什么.... #pragma comment(linker, "/STACK:1024000000,1024 ...

  6. 关于malloc和free函数的用法

    原文:http://blog.pfan.cn/vfdff/33507.html 个人总结 在C语言的学习中,对内存管理这部分的知识掌 握尤其重要!之前对C中的malloc()和free()两个函数的了 ...

  7. linux脚本Shell之九九乘法表

    说到9*9乘法表,许多朋友在想这是小学二年级就会的东西,不错,确实是这样,那么在linux下,使用shell打印出99乘法表应该如何编写脚本的? 笔者的文档今天就写下来,有需要的朋友可以参考下 代码: ...

  8. HDU2539:点球大战

    Problem Description 在足球比赛中,有不少赛事,例如世界杯淘汰赛和欧洲冠军联赛淘汰赛中,当比赛双方经过正规比赛和加时赛之后仍然不分胜负时,需要进行点球大战来决定谁能够获得最终的胜利. ...

  9. CentOS中由一般用户切换为root用户

    --->http://www.centoscn.com/CentOS/help/2014/0624/3173.html 1.打开终端,提示符为“$”,表明该用户为普通用户,此时,直接输su,回车 ...

  10. dp + 组合数 Codeforces Beta Round #9 (Div. 2 Only) D

    http://codeforces.com/problemset/problem/9/D 题目大意:给你一个二叉树和n个数字,满足左小右大,能形成多少种不同的二叉树 思路:定义dp[i][j]表示目前 ...