ぷろみん

プログラミング的な内容を扱ってます

修正:C++のAbstractFactoryはvirtualを使わない

C++のAbstractFactoryはvirtualを使わない - ぷろみん

前回のが抽象化できてない事が発覚したので修正しました。
前回のに修正を乗っけようと思ったのですが、そうするとMixinらへんも関係無くなるので新しいのにしておきました。

抽象化

#include<iostream>
namespace torini {

    class Toy {
    public:
        void Play() const {}
    };
    
    class Game {
    public:
        void Play() const {}
    };
    
    // CRTP
    template<class Factory>
    class AbstractFactory {
    public:
        auto CreateToy() {
            return static_cast<const Factory&>(*this).template Create<Toy>();
        }
        
        auto CreateGame() {
            return static_cast<const Factory&>(*this).template Create<Game>();
        }
    };
    
    class FactoryA : public AbstractFactory<FactoryA> {
    public:
        template<class Product>
        Product Create() const {
            std::cout << "FactoryA" << std::endl;
            return Product();
        }
    };
    
    class FactoryB : public AbstractFactory<FactoryB> {
    public:
        template<class Product>
        Product Create() const {
            std::cout << "FactoryB" << std::endl;
            return Product();
        }
    };
}

int main() {
    auto factory = torini::FactoryB();
    
    auto toy = factory.CreateToy();
    toy.Play();

    auto game = factory.CreateGame();
    game.Play();
}