本文主要是介绍【重读设计模式】抽象工厂模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
抽象工厂模式是一个比较常见的模式,但是个人觉得其相对复杂,比较少能用到这个模式,一般情况下通过简单工厂或者工厂方法模式都可以解决,所以能使用到抽象工厂的场景不是很多。但是在某些特定场景下,使用抽象工厂模式会极大的使系统变得更易扩展,逻辑清晰,下面我们就来看具体的抽象工厂模式。
定义:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
这个定义非常的晦涩难懂,比较容易理解的解释就是,抽象工厂提供了一个可以一次性创建一组对象的方法,而且创建的对象是抽象的,而不是具体的类。这样解释还是有点难以理解,下面通过具体的例子来解释比较清晰。在最后总结的时候在回头来看就会比较容易理解了。

// Name : abstractfactory.cpp
// Author : tester
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
#include <stdio.h>
using namespace std;
//汽车配件基类
class CTyre //轮胎
{
public:
virtual void show_tyre() = 0;
};
class CTyreA : public CTyre
{
public:
void show_tyre()
{
printf("user tyre A.\n");
}
};
class CTyreB : public CTyre
{
public:
void show_tyre()
{
printf("user tyre B.\n");
}
};
class CGlass //玻璃
{
public:
virtual void show_glass() = 0;
};
class CGlassA : public CGlass
{
public:
void show_glass()
{
printf("user glass A.\n");
}
};
class CGlassB : public CGlass
{
public:
void show_glass()
{
printf("user glass B.\n");
}
};
class CFrame //汽车框架
{
public:
virtual void show_frame() = 0;
};
class CFrameA : public CFrame
{
public:
void show_frame()
{
printf("user frame A.\n");
}
};
class CFrameB : public CFrame
{
public:
void show_frame()
{
printf("user frame B.\n");
}
};
class CSit //座椅
{
public:
virtual void show_sit() = 0;
};
class CSitA : public CSit
{
public:
void show_sit()
{
printf("user sit A.\n");
}
};
class CSitB : public CSit
{
public:
void show_sit()
{
printf("user sit B.\n");
}
};
//材料装配长基类
class CCarAssembFactory
{
public:
virtual CTyre* createTyre() = 0;
virtual CGlass* createGlass() = 0;
virtual CFrame* createFrame() = 0;
virtual CSit* createSit() = 0;
};
//比亚迪f1装配厂
class CCarAssembF1Factory : public CCarAssembFactory
{
public:
CTyre* createTyre()
{
return new CTyreA();
}
CGlass* createGlass()
{
return new CGlassA();
}
CFrame* createFrame()
{
return new CFrameA();
}
CSit* createSit()
{
return new CSitA();
}
};
class CCarAssembF3Factory : public CCarAssembFactory
{
public:
CTyre* createTyre()
{
return new CTyreB();
}
CGlass* createGlass()
{
return new CGlassB();
}
CFrame* createFrame()
{
return new CFrameB();
}
CSit* createSit()
{
return new CSitB();
}
};
//比亚迪汽车基类
class CCarByd
{
public:
virtual void get_compent() = 0;
void make() //组装
{
printf("make the car\n");
}
void debug() //调试
{
printf("debug the car\n");
}
void polish() //打磨
{
printf("polish the car\n");
}
void print()
{
printf("print the car\n");
}
protected:
CTyre* m_tyre;
CGlass* m_glass;
CFrame* m_frame;
CSit* m_sit;
CCarAssembFactory* m_assemfactory;
};
//f1生产类
class CCarBydF1 : public CCarByd
{
public:
CCarBydF1(CCarAssembFactory* factory)
{
m_assemfactory = factory;
}
void get_compent()
{
m_tyre = m_assemfactory->createTyre();
m_glass = m_assemfactory->createGlass();
m_frame = m_assemfactory->createFrame();
m_sit = m_assemfactory->createSit();
}
};
//f1生产类
class CCarBydF3 : public CCarByd
{
public:
CCarBydF3(CCarAssembFactory* factory)
{
m_assemfactory = factory;
}
void get_compent()
{
m_tyre = m_assemfactory->createTyre();
m_glass = m_assemfactory->createGlass();
m_frame = m_assemfactory->createFrame();
m_sit = m_assemfactory->createSit();
}
};
int main(int argc, char* argv[]) {
cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
CCarByd* bydcar = NULL;
if(argv[1] == "F1")
{
CCarAssembFactory* carassemb = new CCarAssembF1Factory;
bydcar = new CCarBydF1(carassemb);
}
else// if(argv[2] == "F3")
{
CCarAssembFactory* carassemb = new CCarAssembF3Factory;
bydcar = new CCarBydF3(carassemb);
}
bydcar->make();
bydcar->debug();
bydcar->polish();
bydcar->print();
return 0;
}
这篇关于【重读设计模式】抽象工厂模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!