質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

163閲覧

GOFデザインパターンのビルダーパターンについて自分の作成したコードがそれに沿っているか知りたい

datiko

総合スコア74

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2023/06/01 07:55

実現したいこと

  • 作成したGUIアプリがGOFデザインパターンのビルダーパターンを実現できているかどうかを知りたい

前提

pythonでGOFデザインパターンのビルダーパターンを使用したCUIアプリケーションを作っています。
機能としてはコードを実行すると戦士オブジェクトと魔法使いオブジェクトが作成されてそれぞれを表示するといったものになっております。

発生している問題

作成したものがGOFデザインパターンを実現できているかどうか。

該当のソースコード

main.py

1from abc import ABC, abstractmethod 2 3# キャラクターオブジェクト 4class Character: 5 """ 6 キャラクターオブジェクトを生成するクラス。 7 """ 8 9 def __init__(self): 10 self.name = None 11 self.gender = None 12 self.weapon = None 13 self.armor = None 14 self.job = None 15 16 def display_info(self): 17 """キャラクターの情報を表示するメソッド""" 18 print('='*50) 19 print(f"Name: {self.name}") 20 print(f"Job: {self.job}") 21 print(f"Gender: {self.gender}") 22 print(f"Weapon: {self.weapon}") 23 print(f"Armor: {self.armor}") 24 print('='*50) 25 26 27# 抽象的なビルダー 28class CharacterBuilder(ABC): 29 """ 30 キャラクターオブジェクトを構築するための抽象ビルダークラス。 31 具体的なビルダークラスはこのクラスを継承して実装する。 32 """ 33 34 @abstractmethod 35 def set_name(self, name): 36 """キャラクターの名前を設定するメソッド""" 37 pass 38 39 @abstractmethod 40 def set_job(self): 41 """キャラクターの職業を設定するメソッド""" 42 pass 43 44 @abstractmethod 45 def set_gender(self, gender): 46 """キャラクターの性別を設定するメソッド""" 47 pass 48 49 @abstractmethod 50 def set_weapon(self): 51 """キャラクターの武器を設定するメソッド""" 52 pass 53 54 @abstractmethod 55 def set_armor(self): 56 """キャラクターの防具を設定するメソッド""" 57 pass 58 59 @abstractmethod 60 def get_character(self): 61 """完成したキャラクターオブジェクトを取得するメソッド""" 62 pass 63 64 65# 具体的なビルダー 66class WarriorBuilder(CharacterBuilder): 67 """ 68 戦士(Warrior)キャラクターオブジェクトを構築する具体的なビルダークラス。 69 """ 70 71 def __init__(self): 72 self.character = Character() 73 74 def set_name(self, name): 75 """キャラクターの名前を設定するメソッド""" 76 self.character.name = name 77 78 def set_job(self): 79 """キャラクターの職業を設定するメソッド""" 80 self.character.job = "戦士" 81 82 def set_gender(self, gender): 83 """キャラクターの性別を設定するメソッド""" 84 self.character.gender = gender 85 86 def set_weapon(self): 87 """キャラクターの武器を設定するメソッド""" 88 self.character.weapon = "ソード" 89 90 def set_armor(self): 91 """キャラクターの防具を設定するメソッド""" 92 self.character.armor = "プレートアーマー" 93 94 def get_character(self): 95 """完成したキャラクターオブジェクトを取得するメソッド""" 96 return self.character 97 98 99# 具体的なビルダー 100class MageBuilder(CharacterBuilder): 101 """ 102 魔法使い(Mage)キャラクターオブジェクトを構築する具体的なビルダークラス。 103 """ 104 105 def __init__(self): 106 self.character = Character() 107 108 def set_name(self, name): 109 """キャラクターの名前を設定するメソッド""" 110 self.character.name = name 111 112 def set_job(self): 113 """キャラクターの職業を設定するメソッド""" 114 self.character.job = "魔法使い" 115 116 def set_gender(self, gender): 117 """キャラクターの性別を設定するメソッド""" 118 self.character.gender = gender 119 120 def set_weapon(self): 121 """キャラクターの武器を設定するメソッド""" 122 self.character.weapon = "スタッフ" 123 124 def set_armor(self): 125 """キャラクターの防具を設定するメソッド""" 126 self.character.armor = "ローブ" 127 128 def get_character(self): 129 """完成したキャラクターオブジェクトを取得するメソッド""" 130 return self.character 131 132 133# Director 134class CharacterDirector: 135 """ 136 キャラクターオブジェクトの構築を指揮するディレクタークラス。 137 """ 138 def __init__(self, builder): 139 self.builder = builder 140 141 def create_character(self, name, gender): 142 """ 143 キャラクターオブジェクトを構築するメソッド 144 """ 145 self.builder.set_name(name) 146 self.builder.set_job() 147 self.builder.set_gender(gender) 148 self.builder.set_weapon() 149 self.builder.set_armor() 150 151 return self.builder.get_character() 152 153 154def main(): 155 """メイン処理""" 156 157 # 戦士キャラクターと魔法使いキャラクターのビルダーを作成 158 warrior_builder = WarriorBuilder() 159 mage_builder = MageBuilder() 160 161 # 戦士キャラクターを構築するディレクターを作成 162 director = CharacterDirector(warrior_builder) 163 # 戦士キャラクターを構築して表示 164 warrior = director.create_character("小太刀", "男") 165 warrior.display_info() 166 167 168 # 魔法使いキャラクターを構築するディレクターを作成 169 director = CharacterDirector(mage_builder) 170 # 魔法使いキャラクターを構築して表示 171 mage = director.create_character("花子", "女") 172 mage.display_info() 173 174 175if __name__ == "__main__": 176 main()

調べたこと

ビルダーパターンは制作工程をビルダー毎に切り出して、何を作るか決められるというところに利点がある。
であれば同じ様なテキストをコンソールに出力するようなものではなく同じ情報をHTMLファイルに書き出して表示する様な方法でないとビルダーパターンを実現したとは言えないのではないかと思っております。

ですが一応はビルダー毎にキャラクターを作成しているということは実現できているのでこれはこれでビルダーパターンとして成立しているのではないかとも思います。

果たして、こちらはビルダーパターンと言ってもいいのでしょうか。
それとも私がそもそもの意味合いを理解できていないでしょうか。

詳しい方がいらしたらご回答お願いいたします。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問