読者です 読者をやめる 読者になる 読者になる

ぷろみん

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

C++のAbstractFactoryはvirtualを使わない

抽象化ができてなかったので修正しました。

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

継承

C++では出来る限り継承は使わない方が良いです。
理由としては結びつきが強すぎるからです。
メンバに持って目的の挙動を達成できるのなら、そちらの方が優れています。

Mixin

出来る限り使わない、ではどんな時なら使って良いのか。その使って良い時がMixinとして利用する場合です。
特定のオブジェクトに特定の性質を加える場合、幅広い選択肢があり、再利用性に優れます。また、役割が明確化します。

AbstractFactory

namespace torini {

    class Toy {
    public:
        void Play() const {}
    };
    
    class Game {
    public:
        void Play() const {}
    };

    template<class Product>
    class AbstractFactory {
    public:
        Product Create() const {
            return Product();
        }
    };
    
    template<class ...Types>
    class Factory : public AbstractFactory<Types>... {};

}

int main() {
    auto factory = torini::Factory<torini::Toy, torini::Game>();
    
    auto toy = factory.torini::AbstractFactory<torini::Toy>::Create();
    toy.Play();
    
    auto game = factory.torini::AbstractFactory<torini::Game>::Create();
    game.Play();
}

factory.torini::AbstractFactory<torini::Toy>::Create();が辛い感じなのでfactory.Create<torini::Toy>()と書けてかつfactoryで定義したCreateのみ使えるような方法が分かる方がいたら是非とも教えてくださいな。