ビルダーモードの適用範囲:複数のパーツで構成されるオブジェクトを作成する必要があり、その構成を段階的に完了する必要があります。このオブジェクトは、すべてのパーツが完了したときにのみ完了します。ビルダーモードは、複雑なオブジェクトの作成とパフォーマンスの分離を表すため、同じプロセスのパフォーマンスは異なります。
HTMLページジェネレーターを作成する場合は、ビルダーモードを使用できます。このモードでは、ビルダーとディレクターの2人の参加者がいます。ビルダーは、オブジェクトのさまざまなコンポーネントを作成する責任があります。HTMLの例では、これらのコンポーネントには、ページタイトル、テキストタイトル、コンテンツ本文、およびフッターが含まれます。リーダーは、ビルダーインスタンスを使用して構築プロセスを制御します。HTMLの例では、これはビルダーの関数を呼び出してページタイトルやテキストタイトルなどを設定することを指します。さまざまなビルダーインスタンスを使用すると、コマンダーコードを変更せずにさまざまなHTMLページを作成できます。
1.実生活での例
ファストフードレストランはビルダーデザインパターンを使用しています。複数のハンバーガー(クラシック、チーズバーガーなど)があり、パッケージ(大、中、小の箱など)が異なる場合でも、ハンバーガーとパッケージ(ボックスまたは紙のバッグ)の準備プロセスは同じです。2つのハンバーガーの違いは、製造過程ではなく、性能にあります。司令官はテラーであり、どの食品を準備するかについての指示をスタッフであるビルダーに伝えます。
2.ソフトウェアの例
この記事の冒頭で述べたHTMLの例は、実際にはdjango-widgyに適用されています。django-widgyは、コンテンツ管理システムとして使用できるDjangoのサードパーティツリーエディター拡張機能です。さまざまなレイアウトのHTMLページを作成するためのWebページビルダーが含まれています。
django-query-builderは、ビルダーモードに基づく別のDjangoサードパーティ拡張ライブラリであり、SQLクエリを動的に構築するために使用できます。これを使用して、クエリのすべての側面を制御し、さまざまな種類のクエリを作成できます。
3.アプリケーションケース
オブジェクトを作成するために複数のステップを実行する必要があり、同じ構築プロセスを使用して異なるパフォーマンスを生成する必要があることがわかっている場合は、ビルダーモードを使用できます。たとえば、ページジェネレータ、ドキュメントコンバータ、ユーザーインターフェイスなどです。
ファクトリモードとビルダーモードの違いは、ファクトリモードは単一のステップでオブジェクトを作成するのに対し、ビルダーモードは複数のステップでオブジェクトを作成し、ほとんどの場合1つのリーダーを使用することです。一部のターゲットビルダーパターンの実装では、JavaのStringBufferなどのコマンダーを使用しません。
もう1つの違いは、ファクトリモードでは、作成されたオブジェクトがすぐに返されることです。ビルダーモードでは、クライアントコードは、必要な場合にのみ、コマンダーに最終オブジェクトを返すように明示的に要求します。
新しいコンピューターのアナロジーの例は、ビルダーモデルとファクトリーモデルを区別するのに役立つ場合があります。新しいコンピューターを購入したいとします。たとえば、最新のApple 1.4GHz Mac miniなど、特定の事前構成済みコンピューターモデルを購入する場合は、工場出荷時のモデルを使用します。すべてのハードウェアの仕様はメーカーによって事前に決定されており、メーカーはあなたに相談することなく何をすべきかを知っています。通常、彼らは単一の指示しか受けません。コードは以下のように表示されます
MINI14 = '1.4GHz Mac mini'
クラスAppleFactory:
クラスMacMini14:
def __init __(self):
self.memory = 4#単位はGB
self.hdd = 500#単位はGB
self.gpu = 'IntelHDグラフィックス5000'
def __str __(self):
info =( 'モデル:{}'。format(MINI14)、 'メモリ:{} GB'.format(self.memory)、'ハードディスク:{} GB'.format(self.hdd)、 'グラフィックカード: {} '。format(self.gpu))
'\ n'.join(info)を返します
def build_computer(self、model):
if(model == MINI14):
self.MacMini14()を返す
そうしないと:
print( "{}のビルド方法がわかりません"。format(model))
if __name__ == '__ main __':
afac = AppleFactory()
mac_mini = afac.build_computer(MINI14)
print(mac_mini)
別のオプションは、カスタマイズされたPCを購入することです。この場合、ビルダーモードが使用されます。あなたは司令官であり、メーカー(ビルダー)に指示を出して、頭の中で理想的なコンピューターの仕様を説明します。
クラスコンピュータ:
def __init __(self、serial_number):
self.serial = serial_number
self.memory = None#単位はGBです
self.hdd =なし#単位はGB
self.gpu =なし
def __str __(self):
info =( 'メモリ:{} GB'.format(self.memory)、'ハードディスク:{} GB'.format(self.hdd)、 'グラフィックカード:{}'。format(self.gpu))
'\ n'.join(info)を返します
クラスComputerBuilder:
def __init __(self):
self.computer = Computer( 'AG23385193')
def configure_memory(self、amount):
self.computer.memory =金額
def configure_hdd(self、amount):
self.computer.hdd =金額
def configure_gpu(self、gpu_model):
self.computer.gpu = gpu_model
クラスHardwareEngineer:
def __init __(self):
self.builder =なし
defconstruct_computer(self、memory、hdd、gpu):
self.builder = ComputerBuilder()①
[ステップイン(self.builder.configure_memory(memory)、self.builder.configure_hdd(hdd)、self.builder.configure_gpu(gpu))のステップ]
@property
def computer(self):
self.builder.computerを返します
def main():
エンジニア= HardwareEngineer()
engineer.construct_computer(hdd = 500、memory = 8、gpu = 'GeForce GTX 650 Ti')
コンピューター= engineer.computer
印刷(コンピューター)
if __name__ == '__ main __':
メイン()
基本的な変更は、ビルダーComputerBuilder、コマンダーHardwareEngineerの導入、およびコンピューターを段階的に組み立てるプロセスであり、さまざまな構成がサポートされるようになりました(memory、hdd、およびgpuは正式なパラメーターであり、プリセットされていないことに注意してください)。 。
4.まとめ
この章では、ビルダーのデザインパターンの使用方法を学びました。ファクトリパターン(ファクトリメソッドまたは抽象ファクトリ)が適用できない一部のシナリオでは、ビルダーパターンを使用してオブジェクトを作成できます。次の状況では、ファクトリモードよりもビルダーモードの方が適しています。
[]複雑なオブジェクトを作成したい(オブジェクトは複数の部分で構成されており、オブジェクトを作成するプロセスには多くのステップがあり、おそらくこれらのステップには特定の順序が必要です)。
[]オブジェクトに多くの異なるパフォーマンスを要求し、オブジェクトの構造とパフォーマンスの結合度が低いことを期待します
[]異なる時間にオブジェクトを作成したい
ファストフードレストランが食事の準備にビルダーモードを使用する方法と、2つのサードパーティのDjango拡張パッケージ(django-widgyとdjango-query-builder)がそれぞれビルダーモードを使用してHTMLページと動的SQLクエリを生成する方法を確認しました。ビルダーモードとファクトリーモードの違いを学ぶことに焦点を当て、事前構成された(工場)コンピューターとカスタムメイド(ビルダー)コンピューターを注文と比較することにより、2つの設計モードを明確にしました。
以上が本稿の内容ですので、皆様のご勉強に役立てていただければ幸いです。