環境
- Windows 10
- Python 3.10.1
- VSCode
使用するソースコード
以下の公開リポジトリに置いています
GitHub - masayan1126/tao-py-py: 作業自動化用 Python ライブラリ
作業自動化用 Python ライブラリ. Contribute to masayan1126/tao-py-py development by creating an account on GitHub.
Factory Methodとは
- インスタンス生成の処理の流れは「親クラス」で決定し、実装先の子クラスで具体的なインスタンの生成処理などを実装する設計パターン
- Factory Methodは、オブジェクトの生成手順をパターン化したもの
実装する内容
- スクレイピングで有名なBeautifulSoupのオブジェクトを生成する処理をFactory Methodを活用して構築する
クラス図
- IFactory
- インターフェース。オブジェクトの生成手順のみを定義し、実際の生成については、サブクラスで行う。
- SoupFactory
- createメソッドでオブジェクトを生成する
- createメソッドにはurlオブジェクトを引数に取る
実装
普通に書くとこのようになる
from bs4 import BeautifulSoup
import requests
res = requests.get("your url")
BeautifulSoup(res.text, "html.parser")
まず、Factoryクラスを抽象クラスで作成する
Factoryクラスはcreateメソッドをかならず実装する必要があるように指定する
import abc
class IFactory:
@abc.abstractmethod
def create(self):
pass
続いて、Factoryクラスを実装する具象クラスを作成する
必ずcreateメソッドを実装し、内部の処理でsoupオブジェクトを生成してreturnする(具体的なインスタンの生成処理)
from bs4 import BeautifulSoup
from shared.i_factory import IFactory
from shared.Domain.xurl import XUrl
import requests
class SoupFactory(IFactory):
def create(self, xurl: XUrl) -> BeautifulSoup:
res = requests.get(xurl.get_href())
return BeautifulSoup(res.text, "html.parser")
実際にオブジェクトを生成する際には、このようにFactoryの具象クラスをnewし、createメソッドに必要な引数を渡してあげるだけで、指定したオブジェクトを取得することが可能になる
また、それぞれのクラスで責務が分けられており、コードも英文のように読みやすくなる
from shared.Domain.Scraping.soup_factory import SoupFactory
from shared.Domain.xurl import XUrl
from shared.i_factory import IFactory
factory: IFactory = SoupFactory()
soup = factory.create(XUrl("https://maasaablog.com/"))
正直なところ、具象クラスがまだ1つしかないのでFactory Methodの恩恵は感じられにくいですが、具象クラスが増えれば増えるほど、コードの書きやすさやメンテナンス性がぐっと向上します