PythonのOOPでよく使うデザインパターン3選!初心者でもわかる設計の考え方
生徒
「Pythonでクラスは作れるようになったんですが、設計って何を意識すればいいんですか?」
先生
「そのときに役立つのが、デザインパターンという考え方です。よくある悩みを解決する型のようなものです。」
生徒
「型ってことは、決まった書き方があるんですか?」
先生
「細かい書き方よりも、考え方が大切です。まずはPythonのOOPでよく使われる3つを見ていきましょう。」
1. デザインパターンとは何か
デザインパターンとは、プログラムの設計でよく起こる問題に対して、「こう考えると分かりやすく、直しやすい」という定番の考え方をまとめたものです。難しそうに聞こえますが、日常生活の工夫に近いものです。
例えば、家の中のリモコンを一か所にまとめて置くと探しやすくなります。これも一種の「パターン」です。プログラミングでも、同じような工夫が昔から使われてきました。
Pythonのオブジェクト指向プログラミングでは、クラスを使って現実世界の物事を表現します。そのときに、デザインパターンを知っていると、読みやすくて壊れにくいコードを書けるようになります。
2. シングルトンパターンとは
シングルトンパターンは、「クラスのインスタンスを一つだけにしたい」ときに使われる考え方です。インスタンスとは、クラスという設計図から作られた実物のことです。
例えるなら、家に一つしかない鍵付き金庫です。金庫が何個もあると管理が大変ですが、一つなら安心です。設定情報やアプリ全体で共有する情報は、一つだけにしたいことが多くあります。
Pythonでは、クラスの中で「すでに作られているか」をチェックすることで、この仕組みを実現できます。
class AppConfig:
_instance = None
def __new__(cls):
if cls._instance is None:
cls._instance = super().__new__(cls)
return cls._instance
このように書くことで、何度作ろうとしても同じ箱が返ってきます。シングルトンは「一つだけ存在するもの」を表現したいときに使われる代表的なデザインパターンです。
3. ファクトリパターンとは
ファクトリパターンは、「どのクラスを作るかを、その場で判断したい」ときに使われる考え方です。ファクトリとは工場のことです。工場では、注文内容に応じて違う商品を作ります。
プログラムでも、「条件によって違うクラスを作りたい」という場面があります。そんなときに、直接クラスを作るのではなく、専用の役割を持つ場所に任せます。
class Dog:
def speak(self):
return "ワン"
class Cat:
def speak(self):
return "ニャー"
def animal_factory(kind):
if kind == "dog":
return Dog()
if kind == "cat":
return Cat()
この例では、「どの動物か」を渡すと、それに合ったクラスが作られます。使う側は細かい中身を知らなくてよくなり、コードが分かりやすくなります。
4. ストラテジーパターンとは
ストラテジーパターンは、「やり方を後から切り替えたい」ときに使われる考え方です。ストラテジーとは作戦という意味です。
例えば、同じ道でも歩く、走る、自転車に乗るなど、移動の方法は変えられます。目的は同じでも、やり方だけを入れ替えたい場合に、このパターンが役立ちます。
class Walk:
def move(self):
return "歩く"
class Run:
def move(self):
return "走る"
class Person:
def __init__(self, strategy):
self.strategy = strategy
def move(self):
return self.strategy.move()
このようにすると、Personの中身を変えなくても、動き方だけを差し替えられます。変更に強い設計になるのが大きな特徴です。
5. なぜデザインパターンが重要なのか
初心者のうちは、とにかく動くプログラムを書くだけで精一杯になります。しかし、後から修正するときに、設計がぐちゃぐちゃだと直すのが大変です。
デザインパターンは、「後から見ても分かりやすい形」を作るための道しるべです。PythonのOOPと一緒に覚えておくことで、他の人が読んでも理解しやすいコードになります。
今回紹介したシングルトン、ファクトリ、ストラテジーは、Pythonでも特によく使われる基本的なデザインパターンです。まずは考え方を知るだけでも、大きな一歩になります。