ファクトリメソッドは、インターフェイスまたはクラスがオブジェクトを作成することを可能にする創造的なデザイ ファクトリメソッドを使用して、オブジェクトを作成する最良の方法があります。 ここでは、ロジックをクライアントに公開せずにオブジェクトが作成され、新しいタイプのオブジェクトを作成するために、クライアントは同じ共通
私たちが工場法なしで直面する問題:
あなたが国のさまざまな部分でライドシェアリングを提供する独自のスタートアップを持っていると想像してください。 アプリの最初のバージョンは、二輪車ridesharingを提供しますが、時間が経つにつれて、あなたのアプリが人気になり、今、あなたはまた、三輪と四輪ridesharingを追加したいです。
それは素晴らしいニュースの一部です! しかし、あなたのスタートアップのソフトウェア開発者はどうですか。 コードの大部分がTwo-Wheelerクラスと結合され、開発者はコードベース全体に変更を加える必要があるため、コード全体を変更する必要があります。
これらすべての変更が完了した後、開発者は乱雑なコードか辞表で終わる。
Localizer app
ファクトリメソッドを使用せずに問題を図式的に表現
異なる言語の翻訳とローカライズに関連するもう一つの例で概念を理解しましょう。
ある言語を別の言語に翻訳することを主な目的とするアプリを作成したとしますが、現在は10言語のみで動作しています。 今、私たちのアプリは人々の間で広く人気となっているが、需要は5つのより多くの言語を含むように突然成長しています。
それは素晴らしいニュースの一部です! 所有者のためだけではなく、開発者のために。 コード全体を変更する必要があるのは、コードの大部分が既存の言語のみと結合されているため、開発者はコードベース全体を変更する必要があるためです。
ファクトリメソッドを使用せずに直面する可能性のある問題のコードを見てみましょう。
: 次のコードは、ファクトリメソッドを使用せずに記述されています。
class
FrenchLocalizer:
def
__init__(
self
):
self
.translations
=
{
"car"
:
"voiture"
,
"bike"
:
"bicyclette"
,
"cycle"
:
"cyclette"
}
def
localize(
self
, message):
return
self
.translations.get(msg, msg)
class
SpanishLocalizer:
def
__init__(
self
):
self
.translations
=
{
"car"
:
"coche"
,
"bike"
:
"bicicleta"
,
"cycle"
:
"ciclo"
}
def
localize(
self
, msg):
return
self
.translations.get(msg, msg)
class
EnglishLocalizer:
def
localize(
self
, msg):
return
msg
if
__name__
=
=
"__main__"
:
f
=
FrenchLocalizer()
e
=
EnglishLocalizer()
s
=
SpanishLocalizer()
message
=
for
msg
in
message:
print
(f.localize(msg))
print
(e.localize(msg))
print
(s.localize(msg))
ファクトリメソッドによる解決策:
その解決策は、単純なオブジェクト構築呼び出しを特別なファクトリメソッドへの呼び出しに置き換えるこ 実際にはオブジェクトの作成に違いはありませんが、ファクトリメソッド内で呼び出されています。
たとえば、Two_Wheeler、Three_Wheeler、およびFour_Wheelerクラスは、rideというメソッドを宣言するridesharingインターフェイスを実装する必要があります。 各クラスはこのメソッドを一意に実装します。
solution_factory_diagram
ここで、例の助けを借りてファクトリメソッドを理解しましょう:
class
FrenchLocalizer:
def
__init__(
self
):
self
.translations
=
{
"car"
:
"voiture"
,
"bike"
:
"bicyclette"
,
"cycle"
:
"cyclette"
}
def
localize(
self
, message):
return
self
.translations.get(msg, msg)
class
SpanishLocalizer:
def
__init__(
self
):
self
.translations
=
{
"car"
:
"coche"
,
"bike"
:
"bicicleta"
,
"cycle"
:
"ciclo"
}
def
localize(
self
, msg):
return
self
.translations.get(msg, msg)
class
EnglishLocalizer:
def
localize(
self
, msg):
return
msg
def
Factory(language
=
"English"
):
localizers
=
{
"French"
: FrenchLocalizer,
"English"
: EnglishLocalizer,
"Spanish"
: SpanishLocalizer,
}
return
localizers()
if
__name__
=
=
"__main__"
:
f
=
Factory(
"French"
)
e
=
Factory(
"English"
)
s
=
Factory(
"Spanish"
)
message
=
for
msg
in
message:
print
(f.localize(msg))
print
(e.localize(msg))
print
(s.localize(msg))
ファクトリーメソッドのクラス図:
ライドシェアリングの例を考慮したクラス図を見てみましょう。
Factory_Pattern_Class_Diagrama
ファクトリメソッドを使用する利点:
- 既存のクライアントコードを乱すことなく、新しいタイプの製品を簡単に追加できます。
- 一般的に、製品と作成者のクラスやオブジェクトとの間の緊密な結合は避けられています。
ファクトリメソッドを使用するデメリット:
- particluar具体的な製品オブジェクトを作成するには、clientはcreatorクラスをサブクラス化する必要があります。
- あなたは膨大な数の小さなファイル、すなわちファイルの乱雑になります。
- グラフィックスシステムでは、ユーザーの入力に応じて、長方形、正方形、円などのさまざまな形状を描画できます。 しかし、開発者とクライアントの両方を容易にするために、ユーザーの入力に応じてファクトリメソッドを使用してインスタンスを作成できます。 次に、新しい図形を追加するためにクライアントコードを変更する必要はありません。
- ホテル予約サイトでは、1部屋、2部屋、3部屋などのスロットを予約することができます。 ここでユーザーは、彼が予約したい部屋の数を入力することができます。 Factoryメソッドを使用すると、ユーザーの入力に応じてインスタンスを作成するのに役立つFactoryクラスAnyRoomsを作成できます。 ここでも、新しい機能を追加するためにクライアントのコードを変更する必要はありません。
:
さらに読む:Cの工場パターン++