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 12:C++の標準ライブラリの使用

Day 12では、C++の標準ライブラリの使用について学習します。 C++の標準ライブラリは、様々な便利な関数やコンテナ、アルゴリズムなどを提供しており、プログラムの記述を簡単にしたり、高度な機能を利 …

【C++】Day 18:マルチスレッドプログラミングの基礎

Day 18では、マルチスレッドプログラミングの基礎について学習します。 マルチスレッドプログラミングは、複数のスレッドを使用してプログラムを並行して実行することを意味します。各スレッドは独立して動作 …

【C++】Day 13:メモリ管理とスマートポインタ

Day 13では、メモリ管理とスマートポインタについて学習します。 C++では、メモリの確保と解放を適切に行うことが重要です。スマートポインタは、メモリの自動管理を行う便利な機能です。 以下にそれぞれ …

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

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

【C++】Day 16:C++のラムダ式とSTLアルゴリズム

Day 16では、C++のラムダ式とSTLアルゴリズムについて学習します。 ラムダ式は、簡単な関数をインラインで定義する方法であり、STLアルゴリズムは標準ライブラリのアルゴリズム関数です。 以下にそ …