抽象工廠模式
抽象工廠是負責多個配套類的統一創建,某些類我希望他們配套使用,比如說衣服,當我指定了要穿西裝,如果我要穿衣服(?),那麼我希望創建的是配套的西裝上衣和西裝褲子,而不是西裝上衣配個大褲衩子。
// Coat.h
//衣服抽象類
#pragma once
class Coat
{
public:
virtual void wear() = 0;
}
//Pants.h
//褲子抽象類
#pragma once
class Pant
{
public:
virtual void wear() = 0;
}
//CoatImpl.h
#pragma once
#include "Coat.h"
#include <iostream>
//西裝上衣
class SuitCoat final : public Coat
{
public:
virtual void wear() override
{
std::cout << "Wear suit coat." << std::endl;
}
}
//背心
class Tank final : public Coat
{
public:
virtual void wear() override
{
std::cout << "Wear tank." << endl;
}
}
//PantsImpl.h
#pragma once
#include "Pants.h"
#include <iostream>
//西裝褲子
class SuitPants final : public Pants
{
public:
virtual void wear() override
{
std::cout << "Wear suit pants." << std::endl;
}
}
//運動褲
class SportsShorts final : public Pants
{
public:
virtual void wear() override
{
std::cout << "Wear sports shorts." << endl;
}
}
//Factory.h
#pragma once
#include "Coat.h"
#include "Pants.h"
//抽象工廠類
class AbstractFactory
{
public:
virtual Coat* getCoat() = 0;
virtual Pants* getPants() = 0;
}
//西裝工廠
class SuitFactory final : public AbstractFactory
{
public:
virtual Coat* getCoat() override;
virtual Pants* getPants() override;
}
//運動裝工廠
class SportsFactory final : public AbstractFactory
{
public:
virtual Coat* getCoat() override;
virtual Pants* getPants() override;
}
//Factory.cpp
#include "Factory.h"
#include "CoatImpl.h"
#include "PantsImpl.h"
virtual Coat* SuitFactory::getCoat() override
{
return new SuitCoat();
}
virtual Pants* SuitFactory::getPants() override
{
return new SuitPants();
}
virtual Coat* SportsFactory::getCoat() override
{
return new Tank();
}
virtual Pants* SportsFactory::getPants() override
{
return new SportsShorts();
}
//main.cpp
#include "Factory.h"
int main()
{
//想穿西裝
AbstractFactory* f = new SuitFactory();
Coat* coat = f->getCoat();
coat->wear();
Pants* pants = f->getPants();
pants->wear();
delete coat;
coat = nullptr;
delete pants;
pants = nullptr;
delete f;
f = nullptr;
//要去打球
f = new SportsFactory();
coat = f->getCoat();
coat->wear();
pants = f->getPants();
pants->wear();
delete coat;
coat = nullptr;
delete pants;
pants = nullptr;
delete f;
f = nullptr;
return 0;
}
可以看到,抽象工廠模式,當指定了工廠之後,生產的類一定配套。所以抽象工廠模式是負責生產多個配套使用的類。
抽象工廠和工廠的區別,在於工廠模式只負責一種對象的生成,而抽象工廠負責多個配套類的生成。