首页 / 设计模式 / 设计模式学习笔记--抽象工厂模式
设计模式学习笔记--抽象工厂模式
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了设计模式学习笔记--抽象工厂模式,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2440字,纯文字阅读大概需要4分钟。
内容图文
纠结了好几天,总算是搞懂了点抽象工厂和工厂方法模式的一些区别了。
两篇很好的文章:
http://blog.csdn.net/superbeck/article/details/4446177
http://blog.csdn.net/wyxhd2008/article/details/5597975
抽象工厂其实跟工厂方法模式差不多,都遵循开放--封闭原则,使用工厂接口创建派生工厂,进而创建相应对象。但是抽象工厂更加深层,即一个工厂可以创建一系列的产品,而工厂方法模式一般是一个工厂只创建一个产品。换句话说,抽象工厂是一个产品线,可以生产一系列产品,而每个产品线都能生产各种产品,只是有相应的属性不同。我们在扩展的时候,扩展的是一条产品线。而工厂方法模式中,我们扩展的是一种产品,简单工厂由于有switch case等判定条件,不利于扩展,但是比较简单。
定义:
抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。
一个例子:
// 设计模式Demo.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> #include <string> using namespace std; /* 以游戏引擎U3D UE以及图形库 D3D,OpenGL为例 两个引擎,底层调用可以是D3D或OpenGL,虽然都有两种产品,但是产品族不同。 使用抽象工厂模式 */ //图形库基类 class Graphic { public : virtual void draw() = 0; }; //D3D图形库 class D3D : public Graphic { public: void draw() override { cout<<"D3D draw!"<<endl; } }; //OpenGL图形库 class OpenGL : public Graphic { void draw() override { cout<<"OpenGL draw!"<<endl; } }; //引擎基类 class Engine { public: virtual Graphic* useD3D() = 0; virtual Graphic* useOpenGL() = 0; }; //U3D引擎 class U3DEngine : public Engine { public: //D3D产品(使用D3D图形库) D3D* useD3D() override { cout<<"U3DEngine use D3D!"<<endl; return new D3D(); } //OpenGL产品(使用OpenGL图形库) OpenGL* useOpenGL() override { cout<<"U3DEngine use OpenGL!"<<endl; return new OpenGL(); } }; //UE引擎 class UEEngine : public Engine { public: //D3D产品(使用D3D图形库) D3D* useD3D() override { cout<<"UEEngine use D3D!"<<endl; return new D3D(); } //OpenGL产品(使用OpenGL图形库) OpenGL* useOpenGL() override { cout<<"UEEngine use OpenGL!"<<endl; return new OpenGL(); } }; //客户端 int _tmain(int argc, _TCHAR* argv[]) { //创建一个抽象工厂(实例化U3D工厂) Engine* engine = new U3DEngine(); //两种产品 engine->useD3D()->draw(); engine->useOpenGL()->draw(); //实例化UE工厂 engine = new UEEngine(); //两种产品 engine->useD3D()->draw(); engine->useOpenGL()->draw(); getchar(); return 0; }
结果:
U3DEngine use D3D!
D3D draw!
U3DEngine use OpenGL!
OpenGL draw!
UEEngine use D3D!
D3D draw!
UEEngine use OpenGL!
OpenGL draw!
关于工厂方法模式和抽象工厂模式的区别:
工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
原文:http://blog.csdn.net/puppet_master/article/details/46447457
内容总结
以上是互联网集市为您收集整理的设计模式学习笔记--抽象工厂模式全部内容,希望文章能够帮你解决设计模式学习笔记--抽象工厂模式所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。