設計模式(C++)——抽象工廠模式

抽象工廠模式

抽象工廠是負責多個配套類的統一創建,某些類我希望他們配套使用,比如說衣服,當我指定了要穿西裝,如果我要穿衣服(?),那麼我希望創建的是配套的西裝上衣和西裝褲子,而不是西裝上衣配個大褲衩子。

// 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;
}

可以看到,抽象工廠模式,當指定了工廠之後,生產的類一定配套。所以抽象工廠模式是負責生產多個配套使用的類。
抽象工廠和工廠的區別,在於工廠模式只負責一種對象的生成,而抽象工廠負責多個配套類的生成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章