ゲームBGMをすこれ

【コードあり】ファクトリーメソッドパターンのc++版サンプルコード

WRITER
 

本ページはプロモーションが含まれています

スポンサードリンク



本ページはプロモーションが含まれています

この記事を書いている人 - WRITER -
ゲーム音楽をこよなく愛するものです。 このブログではゲーム音楽に関する記事や大学生活に関する記事、ブログに関する記事を紹介します。 超絶田舎の地方国立大学に通ってます。週1くらいで更新してるので暇なときに見に来てください。たまに面白い記事書いてます。彼女募集中!!←≪重要≫  
詳しいプロフィールはこちら

今回はデザインパターンのファクトリーメソッドパターンのサンプルコードを作成しました。

記事の作成に当たってインプットには以下の書籍やサイトを使って勉強しました。

間違い等あればコメントしてもらえると対応します。

目次

ファクトリーメソッドパターンの概要

ファクトリーメソッドパターンは、オブジェクトの生成をカプセル化し、生成されるオブジェクトの型をサブクラスに委ねるデザインパターンです。

具体的な生成方法をサブクラスに任せることで、クライアントコードは具体的なオブジェクトの型を意識せずにオブジェクトを生成することができます。これにより、柔軟性が向上し、クライアントと生成されるオブジェクトの間の結合度が低くなります。

ファクトリーメソッドパターンという名前の通り、工場と製品のような構造になっており、プロダクト、具象プロダクト、クリエイター、具象クリエイターによって構成されます。

構造はrefactoring.guruの図がわかりやすいのでそれ見て下さい。

c++のサンプルコード

車の工場をサンプルにコードを書いてみました。

プロダクト(Car.h)

製品のメソッドを宣言します。

#pragma once
#include <iostream>

// 車の基本クラス
class Car {
public:
    virtual void drive() const = 0;
    virtual ~Car() {}
};

具象プロダクト(CompactCar.h)

プロダクトを継承し、drive関数を定義します。

#include "Car.h"

// コンパクトカークラス
class CompactCar : public Car {
public:
    void drive() const override {
        std::cout << "Driving a compact car." << std::endl;
    }
};

具象プロダクト(SportCar.h)

#include "Car.h"

// スポーツカークラス
class SportsCar : public Car {
public:
    void drive() const override {
        std::cout << "Driving a sports car." << std::endl;
    }
};

クリエイター(CarFactory.h)

プロダクト型の変数を返すcreateCar関数を宣言します。

#pragma once
#include <iostream>
#include <memory>
#include <string>
#include "Car.h"

// 車のファクトリークラス
class CarFactory {
public:
    // ファクトリーメソッド
    virtual std::unique_ptr<Car> createCar() const = 0;
    virtual ~CarFactory() {}
};

具象クリエイター(CompactCarFactory.h)

クリエイタークラスを継承し、createCar関数を定義します。

createCar関数をコールすると、CompactCarFactoryクラスではCompactCar型のオブジェクトが、SportCarFactoryクラスではSportCar型のオブジェクトが返されます。

#include "CarFactory.h"
#include "CompactCar.h"

// コンパクトカーファクトリークラス
class CompactCarFactory : public CarFactory {
public:
    std::unique_ptr<Car> createCar() const override {
        return std::make_unique<CompactCar>();
    }
};

具象クリエイター(CarFactory.h)

#include "CarFactory.h"
#include "SportCar.h"

// スポーツカーファクトリークラス
class SportsCarFactory : public CarFactory {
public:
    std::unique_ptr<Car> createCar() const override {
        return std::make_unique<SportsCar>();
    }
};

Main関数(main.cpp)

具象クリエイターを宣言し、createCar関数を使用することでCar型のオブジェクトを作成します。

同じCarクラスのdirve関数をコールした場合でも、別の振る舞いをします。

#include "CompactCarFactory.h"
#include "SportCarFactory.h"

int main() {
    // コンパクトカーファクトリーを使用してコンパクトカーを生成
    std::unique_ptr<CarFactory> compactFactory = std::make_unique<CompactCarFactory>();
    std::unique_ptr<Car> compactCar = compactFactory->createCar();
    compactCar->drive(); // Driving a compact car.

    // スポーツカーファクトリーを使用してスポーツカーを生成
    std::unique_ptr<CarFactory> sportsFactory = std::make_unique<SportsCarFactory>();
    std::unique_ptr<Car> sportsCar = sportsFactory->createCar();
    sportsCar->drive(); // Driving a sports car.

    return 0;
}

サンプルコードの実行結果

実行結果は以下のようになります

Driving a compact car.
Driving a sports car.

この記事を書いている人 - WRITER -
ゲーム音楽をこよなく愛するものです。 このブログではゲーム音楽に関する記事や大学生活に関する記事、ブログに関する記事を紹介します。 超絶田舎の地方国立大学に通ってます。週1くらいで更新してるので暇なときに見に来てください。たまに面白い記事書いてます。彼女募集中!!←≪重要≫  
詳しいプロフィールはこちら

- Comments -

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

Copyright© WATA-BLOG(わたブログ) , 2024 All Rights Reserved.