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 29:「セキュリティと暗号化」

Day 29では、「セキュリティと暗号化」について学習します。 セキュリティと暗号化は、情報を保護するための重要な概念です。データの機密性、完全性、可用性を確保するために、データの暗号化、ハッシュ化、 …

【C++】Day 6:関数について

Day 6では、関数について学習します。 関数は、プログラム内で特定のタスクを実行するために使用されるブロック(サブルーチン)です。関数はメインプログラムから呼び出すことができ、再利用性とコードの構造 …

【C++】Day 17:例外安全性とエラーハンドリング

Day 17では、例外安全性とエラーハンドリングについて学習します。 C++では、プログラムが例外(予期しないエラー状態)に遭遇した際に、そのエラーを適切に処理することが重要です。例外安全性は、プログ …

【C++】C++で開発することのメリット/デメリット

C++は多くの利点を持つ強力なプログラミング言語ですが、一方でいくつかのデメリットもあります。 以下に、C++で開発することのメリットとデメリットを詳細に説明します。   メリット 1. パ …

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

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