【コードあり】ファクトリーメソッドパターンのc++版サンプルコード
今回はデザインパターンのファクトリーメソッドパターンのサンプルコードを作成しました。
記事の作成に当たってインプットには以下の書籍やサイトを使って勉強しました。
間違い等あればコメントしてもらえると対応します。
目次
ファクトリーメソッドパターンの概要
ファクトリーメソッドパターンは、オブジェクトの生成をカプセル化し、生成されるオブジェクトの型をサブクラスに委ねるデザインパターンです。
具体的な生成方法をサブクラスに任せることで、クライアントコードは具体的なオブジェクトの型を意識せずにオブジェクトを生成することができます。これにより、柔軟性が向上し、クライアントと生成されるオブジェクトの間の結合度が低くなります。
ファクトリーメソッドパターンという名前の通り、工場と製品のような構造になっており、プロダクト、具象プロダクト、クリエイター、具象クリエイターによって構成されます。
構造は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.