0

「Bill」というクラスがあります。Bill は、すべて POJO である "Electricity" 、 "Food" または "Customer" のいずれかです。したがって、次の 3 つのオブジェクトが含まれます。

    public class Bill{
      private Electricity el1;
      private Food el2;
      private Customer el3;
      //setters and getters
      public setElectricity(...)
      ...
    }

請求書のリストは、いくつかの DTO を使用して入力されます。毎回、すべての要素をチェックして、請求書の種類を確認する必要があります。

私の目標は、この設計をリファクタリングすることです。

オブジェクトを 1 つ持ち、型に関するコンテンツを設定することもできますが、標準的なパターンはありますか?

要求されたタイプに基づいてクラスになることができるクラスのパターンはありますか? つまり、ビルは、人口の時間に関して、電気、食料、または顧客のいずれかになります。

注: 私のアプリケーションは、継承よりも合成を好みました。これは、「契約による設計」ベースのアプリケーションでもあります。

編集: Bill はそのオブジェクトの要約ではありません。食品は、色やレシートなどの食品の仕様にすぎないと仮定しましょう。法案は、ある時点で唯一のオブジェクトになることができます。

4

4 に答える 4

1

多くのパラメーターを持つ大きなオブジェクトがあり、そのうちのいくつかはオプションである可能性があります。

Builder パターンを使用して、Billクラスのインスタンスを作成できます。

ポリモーフィズムを有効にすることを目的とする抽象ファクトリ パターンやファクトリ メソッド パターンとは異なり、ビルダー パターンの目的は、伸縮コンストラクターのアンチパターンに対する解決策を見つけることです。伸縮コンストラクターのアンチパターンは、オブジェクト コンストラクター パラメーターの組み合わせの増加がコンストラクターの指数関数的リストにつながる場合に発生します。ビルダー パターンは、多数のコンストラクターを使用する代わりに、別のオブジェクトであるビルダーを使用します。このオブジェクトは、各初期化パラメーターを段階的に受け取り、結果として構築されたオブジェクトを一度に返します。

家を建てているとします。

public House getHouse() {
    return this.houseBuilder.getHouse();
  }

  public void constructHouse() {
    this.houseBuilder.buildBasement();
    this.houseBuilder.buildStructure();
    this.houseBuilder.bulidRoof();
    this.houseBuilder.buildInterior();
  }

Java Papersの例

于 2013-08-31T14:44:05.757 に答える
0

Bill にインスタンスが 1 つしか含まれない場合、インターフェースを使用しない理由はありません。

    public interface Billable {

        double getPrize();
    }

    public class Electricity implements Billable {

        @Override
        public double getPrize() {
            return 20.0;
        }
    }

    public class Bill {

        /**
         * Billable to bill.
         */
        Billable billable;
        /*
         * Discount percent applied to bill.
         */
        @Min(0)
        @Max(100)
        double discount;
        /**
         * VAT percent applied to bill.
         */
        @Min(0)
        @Max(100)
        double vat;

        public Bill(@NotNull Billable billable) {
            this.billable = billable;
            discount = 10.0;
            vat = 21.0;
        }


        public double getFinalPrize() {
            double discountFactor = 1 - discount / 100;
            double vatFactor = 1 + vat / 100;
            return billable.getPrize() * discountFactor * vatFactor;
        }

        public static void main(String[] args) {
            Electricity electricity = new Electricity();
            Bill electricityBill = new Bill(electricity);
            System.out.println(electricityBill.getFinalPrize());

        }
    }
于 2013-08-31T23:30:03.733 に答える