デザインパターンのスキルを磨こうとしていますが、これらのパターンの違いは何ですか?それらはすべて同じもののように見えます-特定のエンティティのデータベースロジックをカプセル化して、呼び出し元のコードが基になる永続性レイヤーを認識しないようにします。私の簡単な調査から、それらすべては通常、標準のCRUDメソッドを実装し、データベース固有の詳細を抽象化します。
命名規則(CustomerMapper、CustomerDAO、CustomerGateway、CustomerRepositoryなど)は別として、もしあれば、どのような違いがありますか?違いがある場合、いつどちらを選択しますか?
以前は、次のようなコードを記述しました(単純化された、当然のことですが、通常はパブリックプロパティを使用しません)。
public class Customer
{
public long ID;
public string FirstName;
public string LastName;
public string CompanyName;
}
public interface ICustomerGateway
{
IList<Customer> GetAll();
Customer GetCustomerByID(long id);
bool AddNewCustomer(Customer customer);
bool UpdateCustomer(Customer customer);
bool DeleteCustomer(long id);
}
CustomerGateway
すべてのメソッドに特定のデータベースロジックを実装するクラスがあります。時にはインターフェイスを使用せず、CustomerGatewayのすべてのメソッドを静的にする(そうすれば、テストが難しくなります)ので、次のように呼び出すことができます。
Customer cust = CustomerGateway.GetCustomerByID(42);
これは、Data MapperおよびRepositoryパターンの場合と同じ原則のようです。DAOパターン(ゲートウェイと同じものだと思いますか?)もデータベース固有のゲートウェイを推奨しているようです。
何か不足していますか?同じことを正確に行うために3〜4つの異なる方法があるのは少し奇妙に思えます。