ファサードのデザインパターンとは何ですか?


191

されたファサード他のクラスの多くが含まれているクラスを?

何がデザインパターンになるのですか?私にとっては、普通のクラスのようです。

このファサードパターンを説明してもらえますか?


7
すべての設計パターンは、その実装において一連のクラスです。
フェリックスクリング

1
ファサードパターンは、1つのクラスで複数のインターフェイスを非表示にすることにより、使いやすいインターフェイスを作成します。この記事には詳細があります。
user3199690 2016


「研究努力を示さない」ため、これを低く評価しなければなりませんでした
Roy Truelove

1
@RoyTruelove、あなたがやりたいことをしてください。質問に対する支持的な回答がある限り、気にしません。質問を支持する答えはありますか?
ケビン

回答:


190

設計パターンは、繰り返し発生する問題を解決する一般的な方法です。すべてのデザインパターンのクラスは、単なる通常のクラスです。重要なのは、それらがどのように構造化され、特定の問題を可能な限り最善の方法で解決するためにどのように連携するかです。

ファサードデザインパターンは、複雑なシステムとのインタフェースを簡素化します。これは通常、複雑なシステムのサブシステムを構成するすべてのクラスで構成されているためです。

Aファサードは、システムの複雑な詳細からユーザを遮断し、それらを提供simplified viewしていることのeasy to use。またdecouples、サブシステムの詳細からシステムを使用するコードであり、後でシステムを簡単に変更できます。

http://www.dofactory.com/Patterns/PatternFacade.aspx

http://www.blackwasp.co.uk/Facade.aspx

また、設計パターンを学習する際に重要なことは、どのパターンが特定の問題に適合するかを認識し、それを適切に使用できるようにすることです。パターンを誤用したり、知っているからといって問題に適合させたりすることは非常に一般的です。デザインパターンを学習/使用する際は、これらの落とし穴に注意してください。


9
@kevin:それらをいつ使用するかを知ることが最も難しい部分です。理論的にはパターンは簡単かもしれませんが、実際には難しいです。あなたはこれが経験であることを学ぶことができるだけです。コーディング、コーディング、コーディング。
Felix Kling

ファサードデザインパターンは、詳細クラスの実装を非表示にしてパブリックAPIを安全に提供するためにも使用されます。
yebw 2013

29
jqueryの$は、シンプルなインターフェースを提供し、すべての複雑さを隠すファサードデザインパターンの単なる例です
Ajay Beniwal

実際の例を使ってファサードのデザインパターンを探している人のために。私はこの短いyoutube tutuorialに出会いました。その有用なyoutu.be/dLjJo2v2re8
Sankar ganesh

アプリケーションが大きくなったときに、1つのシステムに複数のファサードレイヤーを設定できますか?
Jeeva Jsb

99

ウィキペディアには、ファサードパターンの良い例があります。

/* Complex parts */

class CPU {
    public void freeze() { ... }
    public void jump(long position) { ... }
    public void execute() { ... }
}

class Memory {
    public void load(long position, byte[] data) { ... }
}

class HardDrive {
    public byte[] read(long lba, int size) { ... }
}

/* Facade */

class ComputerFacade {
    private CPU processor;
    private Memory ram;
    private HardDrive hd;

    public ComputerFacade() {
        this.processor = new CPU();
        this.ram = new Memory();
        this.hd = new HardDrive();
    }

    public void start() {
        processor.freeze();
        ram.load(BOOT_ADDRESS, hd.read(BOOT_SECTOR, SECTOR_SIZE));
        processor.jump(BOOT_ADDRESS);
        processor.execute();
    }
}

/* Client */

class You {
    public static void main(String[] args) {
        ComputerFacade computer = new ComputerFacade();
        computer.start();
    }
}

6
これは良い例です。クライアントも、ファサードのすべてのステップを選択できるようにする必要があります。プライベートメソッドによって何も隠されてはなりません。
Rob、

2
ユースケースを強調していないので、これは良い例ではありません。TOが言ったように、例は通常のクラスを示しています。ハードウェアへの関連付けは構成です。wikiの例では多すぎるかもしれませんが、サブモジュールをインスタンス化する代わりに依存性注入を使用すると、意図が強調され、TOの混乱を回避できる可能性があります。
ManuelSchneid3r 2016年

これは、概念自体を理解するために何千もの単語を一言で囲んでいるだけなので、驚くべき例です。残りの部分は、さまざまなシナリオの詳細にすぎません(もちろん、設計パターンでは、すべてのシナリオをカバーすることはできません)。
Syed

41

前の回答で説明したように、それは消費側クライアントにシンプルなインターフェースを提供します。例:「watch ESPN」は意図された機能です。しかし、それは次のようないくつかのステップを含みます:

  1. 必要に応じてテレビをオンにします。
  2. 衛星/ケーブルの機能を確認します。
  3. 必要に応じてESPNに切り替えます。

しかし、ファサードはこれを簡素化し、クライアントに「ESPN監視」機能を提供するだけです。


29

ファサードはシステムの複雑さを隠し、クライアントがシステムにアクセスできる場所からクライアントへのインターフェースを提供します。

public class Inventory {
public String checkInventory(String OrderId) {
    return "Inventory checked";
}
}

public class Payment {
public String deductPayment(String orderID) {
    return "Payment deducted successfully";
}
}


public class OrderFacade {
private Payment pymt = new Payment();
private Inventory inventry = new Inventory();

public void placeOrder(String orderId) {
    String step1 = inventry.checkInventory(orderId);
    String step2 = pymt.deductPayment(orderId);
    System.out
            .println("Following steps completed:" + step1
                    + " & " + step2);
   }
}

public class Client {
       public static void main(String args[]){
         OrderFacade orderFacade = new OrderFacade();
         orderFacade.placeOrder("OR123456");
         System.out.println("Order processing completed");
       }
  }

サブシステムがを経由せずに相互に通信することは許可されOrderFacadeますか?あなたの例では、間PaymentInventory
Isuru

19

短く簡単な説明:

  • ファサードパターンは、サブシステム内の一連のインターフェイスに統一されたインターフェイスを提供します。
  • Facadeは、サブシステムを使いやすくする上位レベルのインターフェースを定義します。

ファサードがある
場合とない場合のシナリオを理解してください。accout1からaccount2に送金したい場合、呼び出される2つのサブシステムは、account1から引き出してaccount2に入金します。

ファサードあり、なし


シンプルで明確な説明と例、ありがとう!サブシステムの定義についても説明できますか?サブシステムが比較的関連のないサブクラス/関数で構成されている場合、定義はほとんどすべてのクラスに適用されます。サブシステムのクラスは、ファサードをファサードと呼ぶことができる、たとえばモジュールまたはライブラリを形成するなど、非常に密接に関連している必要がありますか?
Benni

@Benniはい、サブシステム(クラスになります)は比較的関連のない関数で構成される場合がありますが、ファサードは、呼び出す特定の関数を決定するクラスです。「ツアーパッケージ」を予約したい場合は、ホテル、タクシー、フライトを1つの場所/フォームで選択し、内部でファサードがさまざまな適切なクラスの機能を呼び出して、最終的な結果を返します。だよね?
アルンラージ

10

ファサードは、他の多くのクラスを含むクラスとして記述されるべきではありません。これは実際にはこのクラスへのインターフェースであり、クラスの使用を簡単にする必要があります。そうしないと、ファサードクラスは役に立たなくなります。


7

あなたの質問について:

Facadeは他の多くのクラスを含むクラスですか?

はい。これは、アプリケーションの多くのサブシステムのラッパーです。

何がデザインパターンになるのですか?私にとっては普通のクラスのようです

すべてのデザインパターンも通常のクラスです。@ Unmesh Kondolikarがこの質問に正しく回答しました。

このファサードについて説明してもらえますか?私はデザインパターンが初めてです。

GoFによると、ファサードのデザインパターンは次のように定義さ れています。

サブシステム内の一連のインターフェースに統合インターフェースを提供します。ファサードパターンは、サブシステムを使いやすくする高レベルのインターフェイスを定義します

ファサードパターンは、通常時に使用されます。

  1. 複雑なシステムにアクセスするには、シンプルなインターフェースが必要です。
  2. サブシステムの抽象化と実装は、密結合されています。
  3. 階層化ソフトウェアの各レベルへのエントリポイントが必要です。
  4. システムが非常に複雑であるか、理解するのが難しい。

クリアトリップウェブサイトの実際の例を見てみましょう。

このウェブサイトは予約するオプションを提供します

  1. フライト
  2. ホテル
  3. フライト+ホテル

コードスニペット:

import java.util.*;

public class TravelFacade{
    FlightBooking flightBooking;
    TrainBooking trainBooking;
    HotelBooking hotelBooking;

    enum BookingType {
        Flight,Train,Hotel,Flight_And_Hotel,Train_And_Hotel;
    }; 

    public TravelFacade(){
        flightBooking = new FlightBooking();
        trainBooking = new TrainBooking();
        hotelBooking = new HotelBooking();        
    }
    public void book(BookingType type, BookingInfo info){
        switch(type){
            case Flight:
                // book flight;
                flightBooking.bookFlight(info);
                return;
            case Hotel:
                // book hotel;
                hotelBooking.bookHotel(info);
                return;
            case Train:
                // book Train;
                trainBooking.bookTrain(info);
                return;
            case Flight_And_Hotel:
                // book Flight and Hotel
                flightBooking.bookFlight(info);
                hotelBooking.bookHotel(info);
                return;
             case Train_And_Hotel:
                // book Train and Hotel
                trainBooking.bookTrain(info);
                hotelBooking.bookHotel(info);
                return;                
        }
    }
}
class BookingInfo{
    String source;
    String destination;
    Date    fromDate;
    Date     toDate;
    List<PersonInfo> list;
}
class PersonInfo{
    String name;
    int       age;
    Address address;
}
class Address{

}
class FlightBooking{
    public FlightBooking(){

    }
    public void bookFlight(BookingInfo info){

    }
}
class HotelBooking{
    public HotelBooking(){

    }
    public void bookHotel(BookingInfo info){

    }
}
class TrainBooking{
    public TrainBooking(){

    }
    public void bookTrain(BookingInfo info){

    }
}

説明:

  1. FlightBooking, TrainBooking and HotelBooking 大規模システムの異なるサブシステムです。 TravelFacade

  2. TravelFacade 以下のオプションのいずれかを予約するためのシンプルなインターフェースを提供します

    Flight Booking
    Train Booking 
    Hotel Booking
    Flight + Hotel booking 
    Train + Hotel booking
    
  3. TravelFacadeのAPIを予約し、内部的にサブシステムのAPIを呼び出します

    flightBooking.bookFlight
    trainBooking.bookTrain(info);
    hotelBooking.bookHotel(info);
    
  4. このようにして、TravelFacadeサブシステムAPIを公開せずに、よりシンプルで簡単なAPIを提供します。

主な要点:(Pankaj Kumarによるjournaldev記事より)

  1. ファサードパターンは、クライアントアプリケーションのヘルパーに似ています
  2. ファサードパターンは、開発のどの時点でも適用できます。通常、インターフェイスの数が増え、システムが完全に xになったときです。
  3. サブシステムインターフェースはFacadeを認識せず、Facadeインターフェースの参照があっはなりません。
  4. ファサードパターンは、同様の種類のインターフェイスに適用する必要があります。その目的は、同様の種類のジョブを実行する複数のインターフェイスではなく、単一のインターフェイスを提供することです

理解を深めるには、ソースメイキングの記事もご覧ください。


6

ファサードパターンは、より単純なインターフェイスを生成するために、結果として他の多くのインターフェイスのラッパーです。

デザインパターンは、繰り返し発生する問題を解決し、一般にコードを簡略化するのに役立ちます。同じパターンを使用することに同意する開発者のチームでは、お互いのコードを保守するときの効率と理解を向上させます。

より多くのパターンについて読んでみてください:

ファサードパターン:http : //www.dofactory.com/Patterns/PatternFacade.aspx#_self1

またはより一般的に:http : //www.dofactory.com/Patterns/Patterns.aspx


nileshgule.com/2012/07/facade-design-pattern.htmlここでは、住宅ローンの検証プロセスの例を使用して、ファサードのデザインパターンについて説明しました。
Nilesh Gule 2012

6

ファサードパターンのもう1つの用途は、チームの学習曲線を減らすことです。例を挙げましょう。

Excelが提供するCOMオブジェクトモデルを利用して、アプリケーションがMS Excelと対話する必要があると仮定します。チームメンバーの1人はすべてのExcel APIを知っており、その上にファサードを作成します。これは、アプリケーションのすべての基本的なシナリオを満たします。チームの他のメンバーがExcel APIの学習に時間を費やす必要はありません。チームは、シナリオの実行に関係する内部またはすべてのMS Excelオブジェクトを知らなくても、ファサードを使用できます。すごくないですか?

したがって、複雑なサブシステムの上に簡素化および統合されたインターフェースを提供します。


5

ファサードのもう1つの例:アプリケーションがデータベースに接続し、UIに結果を表示するとします。ファサードを使用して、データベースを使用して実行する場合やモックオブジェクトを使用する場合と同様に、アプリケーションを構成可能にすることができます。したがって、すべてのデータベース呼び出しをファサードクラスに対して行います。ここで、アプリの構成を読み取り、dbクエリを実行するか、モックオブジェクトを返すかを決定します。このようにして、dbが使用できない場合に備えて、アプリケーションはdb独立になります。


5

ファサードは、主に呼び出される簡略化された関数を公開し、実装は、クライアントが対処しなければならない複雑さを隠します。一般に、実装では複数のパッケージ、クラス、および関数を使用します。ファサードが適切に記述されていると、他のクラスに直接アクセスすることはまれです。たとえば、ATMにアクセスして、いくらか引き出しをするとします。ATMは、所有銀行に直接行くのか、外部銀行の交渉済みネットワークを経由するのかを隠します。ATMはファサードのように機能し、クライアントとして直接処理する必要のない複数のデバイスとサブシステムを消費します。


5

パターンの非常に優れた実例- 車のスターターエンジン -があります。

ドライバーとしては、キーをオンにするだけで車が始動します。可能な限りシンプル。背後では、自動車が正常に始動するために、他の多くの自動車システム(バッテリー、エンジン、燃料など)が関与していますが、それらはスターターの後ろに隠れています。

ご覧のとおり、カースターターはファサードです。他のすべての自動車システムの複雑さを心配することなく、使いやすいインターフェースを提供します。

要約しましょう:

Facadeパターンは、大規模なコードブロックまたはAPIの複雑さを簡素化して隠し、よりクリーンで理解しやすく使いやすいインターフェイスを提供します。


4

ファサードは、ツールキットと完全なアプリケーションの間にあるレベルの機能を備えたクラスであり、パッケージまたはサブシステム内のクラスの使用を簡素化します。Facadeパターンの目的は、サブシステムを使いやすくするインターフェースを提供することです。-C#の本のデザインパターンからの抜粋 。


4

Facadeは、単一のインターフェースオブジェクト内に複雑なサブシステムをカプセル化することについて説明します。これにより、サブシステムを適切に活用するために必要な学習曲線が削減されます。また、潜在的に多くのクライアントからのサブシステムの分離を促進します。一方、ファサードがサブシステムの唯一のアクセスポイントである場合、「パワーユーザー」が必要とする機能と柔軟性が制限されます。

出典:https : //sourcemaking.com/design_patterns/facade


3

設計パターンは、ソフトウェア設計の特定のコンテキスト内で一般的に発生する問題に対する一般的な再利用可能なソリューションです。

ファサードデザインパターンは、クラスまたはエンティティ間の関係を作成する方法を定義する構造パターンです。ファサード設計パターンは、より複雑なサブシステムへの簡略化されたインターフェースを定義するために使用されます。

ファサードパターンは、多数の相互依存クラス、または複数のメソッドの使用を必要とするクラスで作業する場合、特に使用が複雑であるか理解が難しい場合に最適です。ファサードクラスは「ラッパー」であり、簡単に理解でき、使用方法も簡単な一連のメンバーが含まれています。これらのメンバーは、ファサードユーザーに代わってサブシステムにアクセスし、実装の詳細を隠します。

ファサード設計パターンは、設計が不十分であるが、ソースコードが利用できないか、既存のインターフェイスが広く使用されているためにリファクタリングできないサブシステムをラップする場合に特に役立ちます。場合によっては、複数のファサードを実装して、さまざまな目的で機能のサブセットを提供することもできます。

ファサードパターンの使用例の1つは、Webサイトをビジネスアプリケーションと統合することです。既存のソフトウェアには、特定の方法でアクセスする必要がある大量のビジネスロジックが含まれている場合があります。Webサイトは、このビジネスロジックへの限られたアクセスのみを必要とする場合があります。たとえば、Webサイトでは、販売対象のアイテムの在庫が限られているかどうかを示す必要がある場合があります。facadeクラスのIsLowStockメソッドは、これを示すブール値を返す可能性があります。舞台裏では、この方法は、現在の物理的な在庫、入荷在庫、割り当てられたアイテム、および各アイテムの低い在庫レベルの処理の複雑さを隠す可能性があります。



2

複数のメソッドを呼び出すためのラッパーを作成するだけです。メソッドx()およびy()のAクラスと、メソッドk()およびz()のBクラスがあります。x、y、zを一度に呼び出し、Facadeパターンを使用してFacadeクラスを作成し、メソッドを作成するには、xyz()と言います。各メソッド(x、y、z)を個別に呼び出す代わりに、それらのメソッドを呼び出すファサードクラスのラッパーメソッド(xyz())を呼び出すだけです。

同様のパターンはリポジトリですが、主にデータアクセスレイヤー用です。


1

それは基本的に単一ウィンドウのクリアランスシステムです。別のクラスの特定のメソッドに委任する作業を割り当てます。



1

ファサードパターンは、サブシステムインターフェイスグループに統一されたインターフェイスを提供します。ファサードは、サブシステムでの作業を簡素化する高レベルのインターフェースを定義します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.