C++设计模式——抽象⼯⼚模式(含实例)
前⾔
伟创⼒(世界500强企业),公司有笔记本⽣产车间、电视机车间、空调车间、电话⽣产等车间,各⽣产车间各⾏其责,⽣产出不同类型的产品。伟创⼒不再是⽣产单⼀产品的企业,⽽是⽣产出多种不同类型的产品,各产品属于不同产品等级结构中。在设计模式中,也存在⼀种类似的模式,可以创建⼀系列产品,这些产品位于不同产品等级结构,产品之间可以没有任何联系,但他们组合起来,可以成为⼀个产品族,称之为抽象⼯⼚模式。
1、产品等级结构与产品族
在⼯⼚⽅法模式中具体⼯⼚负责⽣产具体的产品,每⼀个具体⼯⼚对应⼀种具体产品,⼯⼚⽅法具有唯⼀性。但是有时候我们希望⼀个⼯⼚可以提供多个产品对象,⽽不是单⼀的产品对象,如⼀个电器⼯⼚,它可以⽣产电视机、电冰箱、空调等多种电器,⽽不是只⽣产某⼀种电器。为了更好地理解抽象⼯⼚模式,我们先引⼊两个概念:
(1) 产品等级结构:产品等级结构即产品的继承结构,如⼀个抽象类是电视机,其⼦类有海尔电视机、TCL电视机,创维电视机。则抽象电视机与具体品牌的电视机之间构成了⼀个产品等级结构,抽象电视机是⽗类,⽽具体品牌的电视机是其⼦类。
产品等级结构图
(2) 产品族:在抽象⼯⼚模式中,产品族是指由同⼀个⼯⼚⽣产的,位于不同产品等级结构中的⼀组产品,如海尔电器⼯⼚⽣产的海尔电视机、海尔电冰箱。海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中,海尔电视机、海尔电冰箱构成了⼀个产品族
产品族图
当系统所提供的⼯⼚⽣产的具体产品并不是⼀个简单的对象,⽽是多个位于不同产品等级结构、属于不同类型的具体产品时就可以使⽤抽象⼯⼚模式。抽象⼯⼚模式是所有形式的⼯⼚模式中最为抽象和
最具⼀般性的⼀种形式。抽象⼯⼚模式与⼯⼚⽅法模式最⼤的区别在于,⼯⼚⽅法模式针对的是⼀个产品等级结构,⽽抽象⼯⼚模式需要⾯对多个产品等级结构,⼀个⼯⼚等级结构可以负责多个不同产品等级结构中的产品对象的创建。当⼀个⼯⼚等级结构可以创建出分属于不同产品等级结构的⼀个产品族中的所有对象时,抽象⼯⼚模式⽐⼯⼚⽅法模式更为简单、更有效率。
2、BeyondCompare的设计与实现
BeyondCompare是⼀款代码⽐较软件,能够⽐较不同版本的代码之间的差异,类似SVN版本控制器。例如:在版本1基础之上进⾏修改升级为版本2,BeycongComapare能够对版本1和2代码进⾏⽐较,检测出哪些地⽅存在差异。需求:设计⼀款类似BeyondCompare的软件,能够在Windows平台和Linux平台下对Cpp格式和Java格式的源代码进⾏⽐较,检测出差异。
2.1 使⽤简单⼯⼚模式的实现⽅式
代码格式类型图
格式⼯⼚图
要在Windows和Linux平台下都能针对Cpp和Java代码格式⽂件进⾏⽐较,考虑到扩展性,可以定义⼀个抽象CPP
类,Windows平台下的Cpp格式和Linux平台下的Cpp格式都继承于这个抽象Cpp类。同时定义⼀个抽象Java类,Windows平台下的Java格式和Linux平台下的Java格式都继承于这个抽象Java类
2.2 格式类的定义
代码格式类型实现如下:
#ifndef _PRODUCT_H_
#define _PRODUCT_H_
#include <iostream>
#include <string>
using namespace std;
//抽象Cpp代码格式类
class CppCodeStyle
{
public:
//虚函数,⽤于显⽰处理的代码格式
virtual void DisplayCodeStyle() = 0;
};
//Windows Cpp代码格式
class WindowsCppCodeStyle : public CppCodeStyle
{
public:
void DisplayCodeStyle()
{
cout << "我对Windows Cpp⽂件进⾏代码⽐较" << endl;
}
};
//Linux Cpp代码格式
class LinuxCppCodeStyle : public CppCodeStyle
{
public:
void DisplayCodeStyle()
{
cout << "我对Linux Cpp⽂件进⾏代码⽐较" << endl;
}
};
/*********************************************************/
/*********************************************************/
//抽象Java代码格式
class JavaCodeStyle
{
public:
/
/虚函数,⽤于显⽰处理的代码格式
virtual void DisplayCodeStyle() = 0;
};
//Windows Java代码格式
class WindowsJavaCodeStyle : public JavaCodeStyle
{
public:
void DisplayCodeStyle()
{
cout << "我对Windows Java⽂件进⾏代码⽐较" << endl;
}
};
};
//Linux Java代码格式
class LinuxJavaCodeStyle : public JavaCodeStyle
{
public:
void DisplayCodeStyle()
{
cout << "我对Linux Java⽂件进⾏代码⽐较" << endl;
}
};
#endif
2.3 格式⼯⼚类的定义
Cpp格式和Java格式是两种不同类型的产品,因此可以提供两个简单⼯⼚,⼀个⼯⼚⽤于创建不同平台下的Cpp格式对象,另⼀个⼯⼚⽤于创建不同平台下的Java格式对象。
格式⼯⼚实现代码如下:
#ifndef _PRODUCT_FACTORY_H_
#define _PRODUCT_FACTORY_H_
#include "Product.h"
//Cpp格式⼯⼚
class CppProductFactory
{
public:
//创建具体平台的Cpp,strCppType表⽰windows还是linux下的cpp static CppCodeStyle * CreateCpp(string strCppType)
{
CppCodeStyle * pCppCodeStyle = NULL;
if( 0 == strcmp(strCppType.c_str(), "Windows Cpp") )
{
pCppCodeStyle = new WindowsCppCodeStyle();
}
else if( 0 == strcmp(strCppType.c_str(), "Linux Cpp") )
{
pCppCodeStyle = new LinuxCppCodeStyle();
}
else
{
return NULL;
}
return pCppCodeStyle;
}
};
//Java格式⼯⼚
class JavaProductFactory
{
public:
/
/创建具体平台的Java,strJavaType表⽰windows还是linux下的Java static JavaCodeStyle * CreateJava(string strJavaType)
{
JavaCodeStyle * pJavaCodeStyle = NULL;
if( 0 == strcmp(strJavaType.c_str(), "Windows Java") )
{
pJavaCodeStyle = new WindowsJavaCodeStyle();
}
else if( 0 == strcmp(strJavaType.c_str(), "Linux Java") )
{
pJavaCodeStyle = new LinuxJavaCodeStyle();
}
else
{
return NULL;
}
return pJavaCodeStyle;
}
};
#endif
2.4 编译执⾏结果
编译并执⾏,结果如下:
2.5 简单⼯程模式存在的问题及分析
使⽤简单⼯⼚模式基本上能够实现上述的需求,但从程序执⾏结果来看:"我对Linux Cpp⽂件进⾏代码⽐较和"我对Linux Java⽂件进⾏代码⽐较",显然是不合理的。既然是⼀款BeyongdCompare代码⽐较软件,安装在Windows下就只能对Windows下的Cpp和Java代码进⾏⽐较,⽽不能对Linux下的代码格式⽂件进⾏⽐较。从程序执⾏结果来看,既能对Windows 下的Cpp⽂件进⾏⽐较,同时⼜能对Linux的Java⽂件进⾏⽐较,那这个软件到底安装在哪个平台上呢?显然结果是不正确的。程序执⾏结果表⽰处理(Windows或者Linux)下的cpp格式和java格式是没有关联的。但实际上(Windows或者Linux)下的Cpp格式和Java格式是有关联的。两者组合在⼀起,表⽰能够对Windows下的Cpp和Java⽂件进⾏处理,或者表⽰能够对Linux下的Cpp和Java⽂件进⾏处理。那如何才能使Cpp格式产品和Java格式产品在某⼀个平台上进⾏关联呢? ------抽象⼯⼚模式可以解决这个问题。
3、抽象⼯⼚模式概述
抽象⼯⼚模式为创建⼀组对象提供了⼀种解决⽅案。与⼯⼚⽅法模式相⽐,抽象⼯⼚模式中的具体⼯⼚不只是创建⼀种产品,它负责创建⼀族产品。抽象⼯⼚模式定义如下:
抽象⼯⼚模式(Abstract Factory Pattern):提供⼀个创建⼀系列相关或相互依赖对象的接⼝,⽽⽆须指定它们具体的
类。它是⼀种对象创建型模式。
在抽象⼯⼚模式中,每⼀个具体⼯⼚都提供了多个⼯⼚⽅法⽤于产⽣多种不同类型的产品,这些产品可以没有任何的联系,且位于不同的产品等级中,但这些产品可以组合起来,构成了⼀个产品族。
抽象⼯⼚模式结构图
java类的概念在抽象⼯⼚模式结构图中包含如下⼏个⾓⾊:
AbstractFactory(抽象⼯⼚):它声明了⼀组⽤于创建⼀族产品的⼯⼚⽅法,每⼀个⼯⼚⽅法对应⼀种产品。这些产品可以没有任何的联系,但这些产品可以组合起来,可以构成⼀个产品族。
ConcreteFactory(具体⼯⼚):它实现了在抽象⼯⼚中声明的创建产品的⼯⼚⽅法,⽣成⼀组具体产品,这些产品构成了⼀个产品族,每⼀个产品都位于某个产品等级结构中。
AbstractProduct(抽象产品):它为每种产品声明接⼝,在抽象产品中声明了产品所具有的业务⽅法。ConcreteProduct(具体产品):它定义具体⼯⼚⽣产的具体产品对象,实现抽象产品接⼝中声明的业务⽅法。
4、使⽤抽象⼯⼚实现BeyongdCompare
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论