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 17:例外安全性とエラーハンドリング

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

【C++】Day 25:パフォーマンスと最適化

Day 25では、パフォーマンスと最適化について学習します。 プログラムのパフォーマンスは、実行速度やメモリ使用量などの面での良し悪しを指します。最適化は、プログラムのパフォーマンスを向上させるために …

【C++】Day 10:継承とポリモーフィズム

Day 10では、継承とポリモーフィズムについて学習します。 以下にそれぞれの内容を詳細に説明します。   継承: 1. 継承の概念: – 継承は、既存のクラス(ベースクラスまた …

【C++】Day 24:デバッグとテスト

Day 24では、デバッグとテストについて学習します。 プログラムを書く際には、バグを見つけて修正するデバッグや、プログラムが正しく動作することを確認するテストが重要です。 以下にデバッグとテストに関 …

【C++】Day 4:制御文の一つである条件分岐(if文、else文、else if文)について

Day 4では、制御文の一つである条件分岐(if文、else文、else if文)について学習します。 条件分岐は、特定の条件に基づいてプログラムのフローを制御するために使用されます。 条件が真(tr …