【设计模式】Abstract Factory模式
抽象工厂模式是工厂方法模式的进一步强化。当工厂函数仅仅须要产生一种类型的产品(全部产品都继承自同一抽象基类)时,使用工厂方法模式就可以。
可是。当用户程序须要创建多种类型的产品,而这些产品又有一定的内在联系,那么就要用到抽象工厂模式了。抽象工厂模式的UML图例如以下所看到的:
AbstractProductA和AbstractProductB是两种不同类型的抽象产品,每种类中的抽象以下又有两种不同类型的实现。
两个详细的工厂ConcreteFactory1和ConcreteFactory2负责生产每种抽象产品下的一个详细产品。
这种关系看起来比較复杂,以下通过一个样例来说明。一下是用C++编写的模拟抽象工厂模式的样例。
#include <iostream>
#include <string> using namespace std; // 笔记本抽象类
class Notebook {
public:
// 全部笔记本拥有的共同接口
virtual void Work() = 0;
}; // 华硕笔记本详细类
class ASUSNotebook : public Notebook {
public:
void Work()
{
cout << "ASUS notebook working..." << endl;
}
}; // 联想笔记本详细类
class LenovoNotebook : public Notebook {
public:
void Work()
{
cout << "Lenovo notebook working..." << endl;
}
}; // 台式机抽象类
class Desktop {
public:
// 全部台式机拥有的共同接口
virtual void Work() = 0;
}; // 华硕台式机详细类
class ASUSDesktop : public Desktop {
public:
void Work()
{
cout << "ASUS desktop working..." << endl;
}
}; // 联想台式机详细类
class LenovoDesktop : public Desktop {
public:
void Work()
{
cout << "Lenovo desktop working..." << endl;
}
}; // 抽象工厂
class AbstractFactory {
public:
virtual Notebook* CreateNotebook() = 0; // 生产台式机的接口
virtual Desktop* CreateDesktop() = 0; // 生产笔记本的接口
}; // 华硕工厂
class FactoryOfASUS : public AbstractFactory {
public:
// 华硕生产的笔记本
Notebook* CreateNotebook()
{
return new ASUSNotebook();
} // 华硕生产的台式机
Desktop* CreateDesktop()
{
return new ASUSDesktop();
}
}; // 联想工厂
class FactoryOfLenovo : public AbstractFactory {
public:
// 联想生产的台式机
Notebook* CreateNotebook()
{
return new LenovoNotebook();
} // 联想生产的笔记本
Desktop* CreateDesktop()
{
return new LenovoDesktop();
}
}; int main()
{
// 注意,用户仅仅拥有抽象接口
AbstractFactory *factory = new FactoryOfASUS(); // 实例化生产华硕电脑的工厂
//AbstractFactory *factory = new FactoryOfLenovo(); // 实例化生产联想电脑的工厂 // 抽象产品类。不同的品牌是通过多态性质体现的
Notebook *myNotebook;
Desktop *myDesktop; myNotebook = factory->CreateNotebook();
myDesktop = factory->CreateDesktop(); myNotebook->Work();
myDesktop->Work(); // 别忘了删除指针
delete factory;
delete myNotebook;
delete myDesktop; system("pause");
return 0;
}
执行结果:
在这个样例中,有两类抽象产品:笔记本Notebook和台式机Desktop。在它们以下又相应了详细的品牌。到底产生哪类品牌的电脑是由详细的工厂对象完毕的。对于用户代码而言,它们仅仅须要实例化详细品牌的工厂,然后通过工厂产生Notebook和Desktop对象就可以。当用户须要更换品牌时,仅仅须要改动第97、99两行代码就可以,例如以下所看到的:
//AbstractFactory *factory = new FactoryOfASUS(); // 实例化生产华硕电脑的工厂
AbstractFactory *factory = new FactoryOfLenovo(); // 实例化生产联想电脑的工厂
改动后的执行结果:
抽象工厂模式的长处就是便于交换产品系列。在上面的样例中。仅仅须要改动一处用户代码便能够更换整个电脑产品系列的品牌。
其次,用户代码包括的都是指向抽象基类的指针,详细的产品通过多态性加以差别,这使得用户代码依赖于抽象接口而不依赖于详细的类,添加了代码的灵活度。
參考:
《大话设计模式》文章15章
版权声明:本文博客原创文章,博客,未经同意,不得转载。
【设计模式】Abstract Factory模式的更多相关文章
- 设计模式 - Abstract Factory模式(abstract factory pattern) 详细说明
Abstract Factory模式(abstract factory pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/ ...
- 一天一个设计模式——Abstract Factory抽象工厂模式
一.模式说明 前面学习了工厂方法(Factory Method)模式.在工厂方法模式中,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类,具体的处理交由子类来处理.这里学习的抽象工厂 ...
- 设计模式(3)-对象创建型模式-Abstract Factory模式
1.对象创建型模式 1.3 Abstract Factory模式 1.3.1 需求 在下面情况能够使用Abstract Factory模式: • 一个系统要独立于它的产品的创建. ...
- 设计模式初学者笔记:Abstract Factory模式
首先啰嗦下创建迷宫所用的Room类.这个类并不直接保存Room四周的构造,而是通过MapSite* _sides[4]这个私有数组成员指向Room四周的构造.那么什么时候将四周构造直接放在Room中, ...
- 面向对象设计——抽象工厂(Abstract Factory)模式
定义 提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类.抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道或关心实际产出的具体产品是什么.这样一来,客户就能从具体的产 ...
- Abstract Factory模式的几个要点
1.如果没有应对“多系列对象构建”的需求变化,则没有必要使用Abstract Factory模式.这时候使用简单的静态工厂完全可以.2.“系列对象”指的是这些对象之间有相互依赖.或作用的关系3.Abs ...
- 简洁 Abstract Factory模式(3.1)
镇楼 在某些书中使用了二维图说明抽象工厂模式.非常好,可是yqj2065不喜欢他们的产品族/产品等级,改成品牌/产品类型. 抽象工厂模式(abstract factory pattern)较工厂方法模 ...
- 设计模式之Factory模式(C++)
Factory模式具有两大重要的功能: (1).定义创建对象的接口,封装了对象的创建: (2).使具体化类工作延迟到了子类中. //Product.h #ifndef _PRODUCT_H_ #def ...
- c++设计模式系列----factory模式
问题: 假设我们要开发一个游戏--打怪物,首先,游戏有分等级,假设有初级,中级两个个等级(就不用flappy bird模式了,那个比较特殊,对一个玩家来说是难以具有持久吸引力的!),不同的等级怪物也是 ...
随机推荐
- Windows Phone 的控件倾斜效果
原文:Windows Phone 的控件倾斜效果 Windows Phone 7的系统设置里,按钮都有一个点击倾斜的效果,但自己添加的控件就没有.但微软提供了这个效果的代码:TiltEffect MS ...
- Apple Swift编程语言入门
1 简单介绍 今天凌晨Apple刚刚公布了Swift编程语言,本文从其公布的书籍<The Swift Programming Language>中摘录和提取而成.希望对各位的iOS&a ...
- Java误区: 静态代码块,当把类将被载入到自己主动运行?
JAVA静态代码块会在类被载入时自己主动运行? 非常多Java开发人员的思想,被这个思想深深的轮奸了n遍,传播这个错误思想的博客,在网上一堆,越来越多的人被轮奸. 如:http://blog.csdn ...
- int a[5]={1,2,3,4,5};printf("%d\n", *((int*)(&a+1)-2);
有说服力的笔试题有一定的期限,问:什么是结果,答案是4,为什么要挤? 我明白(不知道是不正确): &a这是一个数组指针,类型int[5],然后&a添加1其实a+sizeof(int)* ...
- Android开发技巧——PagerAdapter再简单的包
再次内容View的ViewPager该适配器PagerAdapter简包,支持List数据与SparseArray数据.随着更新的浏览功能. 首先,首先贴上顶部抽象类代码: /* * Date: 14 ...
- 第三篇——第二部分——第二文 计划搭建SQL Server镜像
原文:第三篇--第二部分--第二文 计划搭建SQL Server镜像 本文紧跟上一章:SQL Server镜像简介 本文出处:http://blog.csdn.net/dba_huangzj/arti ...
- KindEditor参数具体解释
width 编辑器的宽度.能够设置px或%.比textarea输入框样式表宽度优先度高. 数据类型: String 默认值: textarea输入框的宽度 演示样例: K.create('#id', ...
- KVO
其原理探究
什么是KVO ? KVO这是Key-Value Observing,它提供了一种机制,指定的对象的属性被改动后,则对象就会接受到通知. 简单的说就是每次指定的被观察的对象的属性被改动后.KVO就会自己 ...
- Unity3d 网络编程(三)(Unity3d内置简单的网络server编制)
使用Unity3d内置的网络建立一个简单的server.主机时,请使用机器.创建一个client连接到本机. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv ...
- JEECG移动解决方案 -
针对移动应用的应用系统转换的中间件解决方案
设想: 通过中间件配置,在业务系统中使用到移动应用程序的简单版本.(移动页面生成器) 实现方法: 当前移动应用解决方式非常多:app?html5?微信 採用何种方法来实现?对于一个企业来讲,app分 ...