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

依然以《真菌世界》游戏故事类比,树作为工厂,如果现在有两类树,一类生产快速弄真菌飞机和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. 重复T次的LIS的dp Codeforces Round #323 (Div. 2) D

    http://codeforces.com/contest/583/problem/D 原题:You are given an array of positive integers a1, a2, . ...

  2. cookie和session的区别(搜狐笔试考到的一个题目)

    一.cookie机制和session机制的区别***************************************************************************** ...

  3. JavaScript(10)——Ajax以及跨域处理

    Ajax以及跨域处理 哈哈哈,终于写到最后一章了.不过也还没有结束,说,不要为了学习而学习,恩.我是为了好好学习而学习呀.哈哈哈.正在尝试爱上代码,虽然有一丢丢的难,不过,我相信我会的! [Ajax] ...

  4. html5学习(一) video字段

    html5对视频的支持: html5通过<video></video>字段实现web页面上视频的播放功能. 目前各大浏览器对<video>字段的支持: 当前,vid ...

  5. 《Windows驱动开发技术详解》之读写操作

    缓冲区方式读写操作 设置缓冲区读写方式:

  6. leetcode409

    Given a string which consists of lowercase or uppercase letters, find the length of the longest pali ...

  7. java中static关键字解析

    static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键字的用法和平常容易误解的地方,最后列 ...

  8. csu1010: Water Drinking

    /* 本题的题意: 沙漠中有很多骆驼和一个池塘,0表示池塘,1-N表示骆驼,输入的两个数表示两只骆驼,其中前面的那一头靠近池塘,所有的骆驼队列不交叉不相连,求站在队尾但是离水井最近的骆驼编号 经过分析 ...

  9. 错误: libstdc++.so.6: cannot open shared object file: No such file or directory

    解压完别人提供的openwrt代码,编译时,出现如下错误: # configuration written to .config#mips-openwrt-linux-uclibc-gcc: erro ...

  10. 在Mac OS X系统下 用dd命令将iso镜像写入u盘

    一. Mac下将ISO写入U盘可使用命令行工具dd,操作如下: 1.找出U盘挂载的路径,使用如下命令:diskutil list2.将U盘unmount(将N替换为挂载路径):diskutil unm ...