3

私は、OO 設計スキルの向上に役立つアプリケーションに取り組んでいます。私は課題をほぼ完了しましたが、アプリケーションをより拡張可能にする必要があり、これを達成する方法についていくつかの情報が必要だと感じています。

問題のドメインは、次のように簡単に説明できます。

問題の領域は、ショッピング カート アプリケーションを設計することです。食品、書籍など、商品にはさまざまなカテゴリがあります。商品が対象となる税率は、商品のカテゴリによって異なります。明確に定義された税制があります。たとえば、10% の基本税は食品カテゴリに属する​​品目を除くすべての品目に適用され、すべての輸入品目には 5% の追加の輸入関税税が適用されます。

ここで注目したいのは、特定の税制に対するアイテムの適格性を決定するモジュールです。他の人やインターネットからのアイデアを使用して、以下の税モジュールの設計を考え出しました。

ショッピング カート税モジュールの設計

TaxCriteria :項目が TaxPolicy の対象となるために満たさなければならない条件を定義します。具体的な実装者は isEligible メソッドを実装し、アイテムがポリシーの対象となるかどうかを判断するためのビジネス ロジックを提供します。ImportedTaxCriteria の isEligible メソッドは、アイテムがインポートされているかどうかを確認します。

TaxPolicy : TaxCriteria、適用される税率、および税ポリシーの名前があります。TaxPolicy と TaxCriteria の関係は、指定パターンに基づいています。

SalesPolicy : 1 つ以上の TaxPolicy インスタンスで構成されます。

SalesEngine : SalesEngine には、SalesPolicy と TaxCalculator があります。applyPolicies メソッドには、アイテムのリストを含む Order が渡されます。applyPolicies は、注文の各アイテムを繰り返し処理し、販売ポリシーの各 TaxPolicy に対してその適格性を確認し、該当するポリシーに基づいて TaxCalculator を使用して税金を計算します。

新しい問題ドメイン:

国ごとに異なる販売ポリシーが定義されています。米国の輸入関税は 5%、中国の輸入関税は 3% になる可能性があります。この要件に対処するために、単純なファクトリ パターンを使用することを考えていました。SalesPolicy はもはやクラスではなく、TaxPolicy のリストを返す getTaxPolicies メソッドを持つインターフェースになります。USASalesPolicy と ChinaSalesPolicy は SalesPolicy を実装し、getTaxPolicies メソッドはそれぞれ特定の国に関する TaxPolicy のリストを返します。同様に、すべての国に独自の税計算調整があります。USATaxCalculator と ChinaTaxCalculator は、独立した実装を処理できます。

最後に、SalesEngine には、直接 SalesPolicy と TaxCalcualtor を渡す代わりに、コンストラクターで SalesPolicyFactory と TaxCalculatorFactory が渡されます。applyPolicies メソッドには、国を表す文字列である追加のパラメーターが渡されます。applyPolcies メソッドは国を SalesEngine のファクトリに渡し、それらを使用して、税金の計算に使用される適切な SalesPolicy および TaxCalculator インスタンスを作成します。

これが、これまでの私の思考プロセスです。ファクトリ パターンで明確に定義された設計原則を正当化していますか? SalesPolicy と TaxCalculator が関連製品のファミリを表すように、抽象ファクトリ パターンを使用するにはどうすればよいですか? 私が使用したものよりも問題を解決するためのより良い方法はありますか?

4

2 に答える 2

1

必要に応じて、Abstract Factory パターンを組み込んで、TaxPolicy オブジェクトの作成を処理できます。

あなたの場合、それは以下を含みます:

AbstractTaxPolicyFactory– 抽象メソッドcreateItemCategoryTaxPolicy()および とのインターフェース。createImportDutyTaxPolicy()抽象税ポリシーItemCategoryTaxPolicyおよびを作成しますImportDutyTaxPolicy(これらは「関連製品のファミリ」になります)。

USTaxPolicyFactoryおよびChinaTaxPolicyFactory– 2 つの具体的な工場があり、それぞれがこれら 2 つの方法を実装して、具体的な税政策を作成しますChinaImportDutyTaxPolicy

ItemCategoryTaxPolicyImportDutyTaxPolicyそれぞれの具体的な税制に関するインターフェース

USItemCategoryTaxPolicyUSImportDutyTaxPolicyChinaItemCategoryTaxPolicy、およびChinaImportDutyTaxPolicy– 4 つの具体的な税制。たとえば、実行時にUSImportDutyTaxPolicyは によって作成され、型USTaxPolicyFactoryになりImportDutyTaxPolicyます。

SalesPolicy抽象ファクトリおよび抽象税ポリシー インターフェイスを使用するクライアントになります。たとえば、次のようになります。

AbstractTaxPolicyFactory absFactory = new ChinaTaxPolicyFactory();
// or use a static factory method: 
// TaxPolicyFactoryCreator.createNewFactory(Country.CHINA); 
ItemCategoryTaxPolicy itemCatTaxPolicy = absFactory.createItemCategoryTaxPolicy();
addTaxPolicy(itemCatTaxPolicy);
ImportDutyTaxPolicy importDutyTaxPolicy = absFactory.createImportDutyTaxPolicy();
addTaxPolicy(importDutyTaxPolicy);
于 2012-08-28T17:42:41.443 に答える
0

Factoryパターンを使用します。ロケール情報を受け入れ、上記の動作を実装するクラスを返すファクトリ クラスを実装/設計します。これらの動作の実装は、国ごと、都市ごとに異なるため、ファクトリは、ロケールに適切な実装を提供する特定のクラスを特定して返す必要があります。

于 2012-08-28T14:35:29.540 に答える