Day 26では、デザインパターンのうち「作成型パターン」について学習します。
作成型パターンは、オブジェクトのインスタンスを生成する方法に関するパターンです。主な作成型パターンには、シングルトン、ファクトリ、ビルダー、プロトタイプなどがあります。
以下に作成型パターンの主な内容と、例題、演習問題を提示します。
作成型パターンの主な内容:
1. シングルトンパターン:
– シングルトンパターンは、クラスのインスタンスが1つだけ存在することを保証するパターンです。
– グローバルなオブジェクトを作成せずに、唯一のインスタンスを提供します。
2. ファクトリパターン:
– ファクトリパターンは、インスタンスの生成を専門に行うクラスを用意し、インスタンスの生成をカプセル化するパターンです。
– インスタンスの生成方法を変更したい場合に、影響範囲を限定して変更できます。
3. ビルダーパターン:
– ビルダーパターンは、複雑なオブジェクトの構築過程を隠蔽するパターンです。
– 複数のステップに分けてオブジェクトを構築し、最終的なオブジェクトを取得します。
4. プロトタイプパターン:
– プロトタイプパターンは、既存のオブジェクトをコピーして新しいオブジェクトを生成するパターンです。
– インスタンスの生成にコストがかかる場合に有効です。
例題:
ファクトリパターンの例として、異なるオペレーティングシステムに基づいて異なるダイアログを作成するプログラムを考えてみましょう。
#include <iostream>
#include <memory>
// ダイアログの抽象クラス
class Dialog {
public:
virtual void draw() = 0;
virtual ~Dialog() = default;
};
// Windowsダイアログ
class WindowsDialog : public Dialog {
public:
void draw() override {
std::cout << "Windows Dialog" << std::endl;
}
};
// macOSダイアログ
class MacDialog : public Dialog {
public:
void draw() override {
std::cout << "macOS Dialog" << std::endl;
}
};
// ダイアログを生成するファクトリクラス
class DialogFactory {
public:
std::unique_ptr<Dialog> createDialog(const std::string& os) {
if (os == "Windows") {
return std::make_unique<WindowsDialog>();
} else if (os == "macOS") {
return std::make_unique<MacDialog>();
} else {
throw std::runtime_error("Invalid OS specified.");
}
}
};
int main() {
DialogFactory factory;
std::string os = "macOS"; // 変更して異なるダイアログを生成できます
try {
std::unique_ptr<Dialog> dialog = factory.createDialog(os);
dialog->draw();
} catch (const std::runtime_error& e) {
std::cerr << e.what() << std::endl;
}
return 0;
}
演習問題:
1. シングルトンパターンを使って、ログを出力するクラスを実装してください。同じログ出力クラスのインスタンスを複数回生成しても、常に同じインスタンスが返されるようにしてください。
2. ビルダーパターンを使って、異なる種類のメールを構築するプログラムを作成してください。メールの内容、件名、送信元、送信先などを設定できるようにしてください。
これらの例題と演習問題を解くことで、作成型パターンの理解と実践ができます。問題を解いたら、各パターンが正しく動作しているかどうかを確認してみてください。