抽象工厂模式(Abstract Factory)
GOF:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
类图:
观察类图,关键就在于左边,即AbstractFactory和它的两个子类。想要理解这个模式,我们可以真的将它看作一个工厂。对于生产家电的工厂,一般要生产电视和洗衣机,但是在美国的家电工厂生产的是等离子电视和全自动洗衣机,在非洲的家电工厂生产的是CRT彩电和半自动洗衣机。把这个例子转换成类似上面的类图就如下:
这时,如果想要开工厂,就能从彩电工厂生产标准知道彩电工厂能生产电视和洗衣机,然后根据你在哪个国家来具体决定彩电工厂的类型。
AbstractFactory一般是抽象类(但不是绝对的),它定义了必需的接口,而具体接口的实现放到了子类。用户只需知道Factory中有什么接口就行了,剩下就交给多态吧(在设计模式中,很多巧妙的地方就是靠多态实现的)。
比如:一群学生要去参观家电工厂的生产过程,则代码如下:
void StudentVisit(AbstractFactory& factory) { factory.MakeTV(); factory.MakeWasher(); } int main() { USAFactory factory; StudentVisit(factory); ; }
这里实际传入的参数是美国家电工厂,则实际调用的是美国家电工厂的MakeTV()和MakeWasher()。
适用性:
- 一个系统要独立于它的产品的创建,组合和表示时。(我们只需要知道有什么接口,而不需要了解子类是怎么实现的)
- 一个系统要由多个产品系列中的一个来配置时。(比如上面电视有多种,但是美国彩电工厂要的是等离子电视)
- 当你要强调一系列相关的产品对象的设计以便进行联合使用时。(彩电工厂需要生产电视和洗衣机,这两个就是相关的产品)
- 当你提供一个产品类库,而只想显示它们的接口而不是实现时。(我们只需要调用抽象类的接口,而不需要到子类中看具体的方法)
优点 + 缺点:
- 它分离了具体的类。
- 它使得易于交换产品系列。改变使用的具体工厂就能生产不同的产品。
- 它有利于产品的一致性。每一个具体工厂生产的都是同一等级的产品。
- 难以支持新种类的产品。如果要在抽象类中增加接口,每个具体工厂都要进行修改。
最后以一个创建游戏场景的例子结束,该游戏场景会产生地形,光源,植被。
类图:
代码:
先看看Product,即类图右边的类:
地形类:
class Terrain { public: ; }; class DesertTerrain : public Terrain { public: DesertTerrain() { m_type = "Desert"; } string GetType() const { return m_type; } private: string m_type; }; class MountainTerrain : public Terrain { public: MountainTerrain() { m_type = "Mountain"; } string GetType() const { return m_type; } private: string m_type; };
光源类:
class Light { public: ; }; class SpotLight : public Light{ public: SpotLight() { m_type = "Spot Light"; } string GetType() const { return m_type; } private: string m_type; }; class DirectionLight : public Light { public: DirectionLight() { m_type = "Direction Light"; } string GetType() const { return m_type; } private: string m_type; };
植被类:
class Plant { public: ; }; class TreePlant : public Plant { public: TreePlant() { m_type = "Tree"; } string GetType() const { return m_type; } private: string m_type; }; class CactusPlant : public Plant { public: CactusPlant() { m_type = "Cactus"; } string GetType() const { return m_type; } private: string m_type; };
以下就看工厂类:
class GameSceneFactory { public: ; ; ; }; class DesertSceneFactory : public GameSceneFactory { public: Terrain* MakeTerrain() const { return new DesertTerrain(); } Light* MakeLight() const { return new DirectionLight(); } Plant* MakePlant() const { return new CactusPlant(); } }; class MountainSceneFactory : public GameSceneFactory { public: Terrain* MakeTerrain() const { return new MountainTerrain(); } Light* MakeLight() const { return new SpotLight(); } Plant* MakePlant() const { return new TreePlant(); } };
以下就是具体的使用:
class Game { public: void createScene(GameSceneFactory& factory) { m_terrain = factory.MakeTerrain(); m_light = factory.MakeLight(); m_plant = factory.MakePlant(); print(); } void print() { cout << "------Game Scene------" << endl; cout << "Terrain: " << m_terrain->GetType() << endl; cout << "Light: " << m_light->GetType() << endl; cout << "Plant: " << m_plant->GetType() << endl; } private: Terrain* m_terrain; Light* m_light; Plant* m_plant; }; int main() { Game game; MountainSceneFactory factory; game.createScene(factory); }
结果:
小结:抽象工厂模式是一个比较常用的模式,需要好好掌握。利用真实生活中的工厂就比较好理解该模式的运作,但真正要掌握还得在日常编码中的适当场合使用。
抽象工厂模式(Abstract Factory)的更多相关文章
- .NET设计模式(2):1.2 抽象工厂模式(Abstract Factory)
概述 抽象工厂模式(Abstract Factory)是所有形态的工厂模式中最为抽象和最具一般性的一种形态.抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽象工厂模式可以向客户端提供一个接口 ...
- 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)
原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...
- 【设计模式】抽象工厂模式 Abstract Factory Pattern
简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式 ...
- 设计模式 - 抽象工厂模式(abstract factory pattern) 具体解释
抽象工厂模式(abstract factory pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/2709 ...
- 抽象工厂模式(Abstract Factory)C#实例
抽象工厂模式(Abstract Factory)C#实例 本文出处http://www.dofactory.com/net/abstract-factory-design-pattern 一.场景描述 ...
- 二十四种设计模式:抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式(Abstract Factory Pattern) 介绍提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 示例有Message和MessageModel,Messag ...
- 【UE4 设计模式】抽象工厂模式 Abstract Factory Pattern
概述 描述 提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类:具体的工厂负责实现具体的产品实例 抽象工厂中每个工厂可以创建多种产品(如苹果公司生产iPhone.iPad): 工厂方法 ...
- Net设计模式实例之抽象工厂模式(Abstract Factory Pattern)
一.抽象工厂模式简介(Bref Introduction) 抽象工厂模式(Abstract Factory Pattern),提供一个创建一系列相关或者相互依赖对象的接口,而无需制定他们的具体类.优点 ...
- C#设计模式——抽象工厂模式(Abstract Factory Pattern)
一.概述在软件开发中,常常会需要创建一系列相互依赖的对象,同时,由于需求的变化,往往存在较多系列对象的创建工作.如果采用常规的创建方法(new),会造成客户程序和对象创建工作的紧耦合.对此,抽象工厂模 ...
- Objective-C设计模式——抽象工厂模式Abstract Factory(对象创建)
抽象工厂模式 理解了工厂方法模式,其实抽象工厂和工厂方法模式有很多的相似之处.抽象工厂同样是分离客户端对象的创建和逻辑代码的,但是抽象工厂往往是产生一组数据而不单单是产生一个产品. 抽象工厂提供一个创 ...
随机推荐
- 解决Kali Linux没有声音
解决Kali Linux没有声音 Kali Linux系统默认状态下,root用户是无法使用声卡的,也就没有声音.启用的方法如下: (1)在终端执行命令:systemctl --user enab ...
- 转:delphi异常捕获try except语句 和 try finally语句用法
转:http://www.java123.net/v/936977.html 2015-06-24 09:27:48 一直写程序都没管他们,也尽量很少用,今天终于想把他给弄个明白,在网上找来 ...
- DAY7L2【C001】
出自附中练习场[难度C]————————————————————————————————————————————————————————————— [试题描述]有 N 个任务, 每个任务最多只能完成一 ...
- JavaScript定时器
定时器 开启定时器 Setinterval间隔型 每隔一段时间重复的执行 SetTimeout延时型 只执行一次 两种定时器的区别 <!DOCTYPE html> <htm ...
- HDU4609 3-idiots(母函数 + FFT)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=4609 Description King OMeGa catched three men wh ...
- Java classpath 如何自动添加web-content /lib下的jar包
右键属性--Java build path--Libraries--add library--Web app libraries -- next --next -- ok
- Universal JS module loader
With dependency ;(function (root, factory) { if (typeof define === 'function' && define.amd) ...
- HDU 2222 & ac自动机模板
题意: 求n个模板串在匹配串中出现了几个. SOL: 反正就是模板啦...似乎比KMP都简单----这么说似乎有点不道德...毕竟先看的KMP而他们并没有什么不同... 貌似自己的理解和他们画的图还是 ...
- 神奇的莫比乌斯带(mobius)
1.禅师和青年之间的对话 2.制作一个莫比乌斯带 3.神奇的莫比乌斯带 4.对莫比乌斯带进行简单的数学建模 1.禅师和青年之间的对话 青年问禅师:“大师,我很爱我的女朋友,她也有很多优点,但是总有几个 ...
- JavaScript进阶篇
组团,并给团取个名(如何创建数组) 使用数组之前首先要创建,而且需要把数组本身赋至一个变量.好比我们出游,要组团,并给团定个名字“云南之旅”. 创建数组语法: var myarray=new Arra ...