HiroLab

プログラミングに関する情報発信サイト。

C++

【C++】Day 26:デザインパターン「作成型パターン」

投稿日:

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. ビルダーパターンを使って、異なる種類のメールを構築するプログラムを作成してください。メールの内容、件名、送信元、送信先などを設定できるようにしてください。

これらの例題と演習問題を解くことで、作成型パターンの理解と実践ができます。問題を解いたら、各パターンが正しく動作しているかどうかを確認してみてください。

-C++
-, ,

執筆者:


comment

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

関連記事

【C++】Day 1:C++の基礎構文について

Day 1では、C++の基礎構文について学習します。 プログラムの構造: C++プログラムの基本的な構造を理解する。 C++のプログラムはmain()関数からプログラムが開始されます。 後述する演習問 …

【C++】Day 15:C++のテンプレート

Day 15では、C++のテンプレートについて学習します。 テンプレートは、汎用的なプログラムを作成するための強力な機能で、関数やクラスを汎用的に定義することができます。 以下にテンプレートの主な内容 …

【C++】Day 5:制御文の一つであるループについて

Day 5では、制御文の一つであるループについて学習します。 ループは、特定の処理を繰り返し実行するための構文です。C++には主に3種類のループがあります:forループ、whileループ、do-whi …

【C++】Day 8:オブジェクト指向プログラミング(OOP)の基礎

Day 8では、オブジェクト指向プログラミング(OOP)の基礎について学習します。 以下にそれぞれの内容を詳細に説明し、例題と演習問題を提示します。   オブジェクト指向プログラミングの基礎 …

【C++】Day 30:C++の応用と展望

Day 30では、「C++の応用と展望」について学習します。 C++は非常にパワフルで柔軟なプログラミング言語であり、さまざまな応用分野で使用されています。この日は、C++の応用領域や将来の展望につい …