3、抽象工厂模式概述
抽象工厂模式为创建一组对象提供了一种解决方案。与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一族产品。抽象工厂模式定义如下:
| 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。它是一种对象创建型模式。 |
在抽象工厂模式中,每一个具体工厂都提供了多个工厂方法用于产生多种不同类型的产品,这些产品可以没有任何的联系,且位于不同的产品等级中,但这些产品可以组合起来,构成了一个产品族。

抽象工厂模式结构图
在抽象工厂模式结构图中包含如下几个角色:
AbstractFactory(抽象工厂):它声明了一组用于创建一族产品的工厂方法,每一个工厂方法对应一种产品。这些产品可以没有任何的联系,但这些产品可以组合起来,可以构成一个产品族。
ConcreteFactory(具体工厂):它实现了在抽象工厂中声明的创建产品的工厂方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。
AbstractProduct(抽象产品):它为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法。
ConcreteProduct(具体产品):它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法。
4、使用抽象工厂实现BeyongdCompare

代码格式类型图

格式工厂图
要在Windows和Linux平台下都能对Cpp和Java代码格式文件进行比较,考虑到扩展性,可以定义一个抽象CPP类,Windows平台下的Cpp格式和Linux平台下的Cpp格式都继承于这个抽象Cpp类。 同时定义一个抽象Java类,Windows平台下的Java格式和Linux平台下的Java格式都继承于这个抽象Java类。
定义一个抽象格式工厂,Windows格式工厂继承于抽象格式工厂,用于创建Windows下的Cpp和Java格式对象。 Linux格式工厂也继承于抽象格式工厂,用于创建Linux下的Cpp和Java格式对象。 代码格式类型实现如下:
#ifndef _PRODUCT_H_
#define _PRODUCT_H_
#include
#include
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
BeyondCompare软件能运行在Windows平台和Linux平台,每个平台都能对Cpp文件和Java文件进行比较。因此可以创建一个Windows工厂,用于创建Windows下的Cpp对象和Java对象。创建一个Linux工厂,用于创建Linux下的Cpp对象和Java对象。这样Cpp对象和Java对象就被限制在了某个平台下。即Cpp对象和Java对象要么同属于Windows,要么同属于Linux。而不会出现使用简单工厂模式出现的情况:"Cpp属于Windows平台,而Java属于Linux平台"。 格式工厂实现代码如下:
#ifndef _PRODUCT_FACTORY_H_
#define _PRODUCT_FACTORY_H_
#include "Product.h"
//抽象代码格式工厂
class CodeStyleFactory
{
public:
//工厂方法,创建具体的Cpp格式对象
virtual CppCodeStyle * CreateCpp() = 0;
//工厂方法,创建具体的Java格式对象
virtual JavaCodeStyle * CreateJava() = 0;
};
//Windows代码格式工厂
class WindowsCodeStyleFactory : public CodeStyleFactory
{
public:
//工厂方法,创建具体的Cpp格式对象
CppCodeStyle * CreateCpp()
{
CppCodeStyle * pCppCodeStyle = new WindowsCppCodeStyle();
return pCppCodeStyle;
}
//工厂方法,创建具体的Java格式对象
JavaCodeStyle * CreateJava()
{
JavaCodeStyle * pJavaCodeStyle = new WindowsJavaCodeStyle();
return pJavaCodeStyle;
}
};
//Linux代码格式工厂
class LinuxCodeStyleFactory : public CodeStyleFactory
{
public:
//工厂方法,创建具体的Cpp格式对象
CppCodeStyle * CreateCpp()
{
CppCodeStyle * pCppCodeStyle = new LinuxCppCodeStyle();
return pCppCodeStyle;
}
//工厂方法,创建具体的Java格式对象
JavaCodeStyle * CreateJava()
{
JavaCodeStyle * pJavaCodeStyle = new LinuxJavaCodeStyle();
return pJavaCodeStyle;
}
};
#endif 测试文件实现代码如下:
#include
using namespace std;
#include "Product.h"
#include "ProductFactory.h"
int main()
{
/*************创建Windows Cpp ************************************/
CodeStyleFactory * pWindowsCodeStyleFactory = new WindowsCodeStyleFactory();
CppCodeStyle * pWindowsCppCodeStyle = pWindowsCodeStyleFactory->CreateCpp();
pWindowsCppCodeStyle->DisplayCodeStyle();
/*************创建Windows Java ************************************/
JavaCodeStyle * pWindowsJavaCodeStyle = pWindowsCodeStyleFactory->CreateJava();
pWindowsJavaCodeStyle->DisplayCodeStyle();
cout << "***********************************" << endl;
/*************创建Linux Cpp ************************************/
CodeStyleFactory * pLinuxCodeStyleFactory = new LinuxCodeStyleFactory();
CppCodeStyle * pLinuxCppCodeStyle = pLinuxCodeStyleFactory->CreateCpp();
pLinuxCppCodeStyle->DisplayCodeStyle();
/*****