Byggare mönster

Byggmönstret är ett designmönster som är utformat för att ge en flexibel lösning på olika objektskapande problem i objektorienterad programmering . Avsikten med byggarens designmönster är att skilja konstruktionen av ett komplext objekt från dess representation. Det är ett av Gang of Four designmönster .

Översikt

Builders designmönster är ett av designmönsterna som beskriver hur man löser återkommande designproblem i objektorienterad programvara.

Builders designmönster löser problem som:

  • Hur kan en klass (samma byggprocess) skapa olika representationer av ett komplext objekt?
  • Hur kan en klass som inkluderar att skapa ett komplext objekt förenklas?

Att skapa och montera delarna av ett komplext objekt direkt inom en klass är oflexibelt. Det förbinder klassen att skapa en viss representation av det komplexa objektet och gör det omöjligt att ändra representationen senare oberoende av (utan att behöva ändra) klassen.

Builders designmönster beskriver hur man löser sådana problem:

  • Kapsla in att skapa och montera delarna av ett komplext objekt i ett separat Builder- objekt.
  • En klass delegerar objektskapande till ett Builder- objekt istället för att skapa objekten direkt.

En klass (samma byggprocess) kan delegera till olika Builder- objekt för att skapa olika representationer av ett komplext objekt.

Definition

Avsikten med Builder-designmönstret är att skilja konstruktionen av ett komplext objekt från dess representation. Genom att göra det kan samma byggprocess skapa olika representationer.

Fördelar

Fördelarna med Builder-mönstret inkluderar:

  • Låter dig variera en produkts interna representation.
  • Kapslar in kod för konstruktion och representation.
  • Ger kontroll över steg i byggprocessen.

Nackdelar

Nackdelarna med Builder-mönstret inkluderar:

  • En distinkt ConcreteBuilder måste skapas för varje typ av produkt.
  • Builder-klasser måste vara föränderliga.
  • Kan försvåra/komplicera beroendeinjektion.

Strukturera

UML klass och sekvensdiagram

Ett exempel på UML-klass och sekvensdiagram för Builder-designmönstret.


I ovanstående UML- klassdiagram skapar och sammanställer inte klassen Director ProductA1- och ProductB1 - objekten direkt. Istället regissören till Builder- gränssnittet för att bygga (skapa och montera) delarna av ett komplext objekt, vilket gör direktören oberoende av vilka konkreta klasser som instansieras (vilken representation som skapas). Klassen Builder1 implementerar Builder- gränssnittet genom att skapa och montera ProductA1- och ProductB1 -objekten. UML - sekvensdiagrammet visar körtidsinteraktionerna: Director -objektet anropar buildPartA() Builder1- objektet, vilket skapar och sätter samman ProductA1 -objektet. Därefter anropar regissören buildPartB() Builder1 , som skapar och monterar ProductB1 -objektet.

Klassdiagram

Builder Structure
Builder
Abstrakt gränssnitt för att skapa objekt (produkt).
ConcreteBuilder
Tillhandahåller implementering för Builder. Det är ett objekt som kan konstruera andra objekt . Konstruerar och monterar delar för att bygga föremålen.

Exempel

Ett C# exempel:




  

          
          
          
          

            
    
          
          
          
          
    





  

         
         

     





    

          
          

      
    
                           
    





  

      
       
    
          
    

      
    
          
          
    

      
	
		 
	


  

      
    
             
        
           
    
 /// <summary>  /// Representerar en produkt skapad av byggaren  /// </summary>  public  class  Cykel  {  public  string  Make  {  get  ;  set  ;  }  offentlig  sträng  Modell  {  get  ;  set  ;  }  public  int  Höjd  {  get  ;  set  ;  }  offentlig  sträng  Färg  {  get  ;  set  ;  }  public  Bicycle  (  string  make  ,  string  model  ,  string  color  ,  int  height  )  {  Make  =  make  ;  Modell  =  modell  ;  Färg  =  färg  ;  Höjd  =  höjd  ;  }  }  /// <summary>  /// Byggarens abstraktion  /// </summary>  offentligt  gränssnitt  IBicycleBuilder  {  string  Color  {  get  ;  set  ;  }  int  Höjd  {  ;  set  ;  }  Cykel  GetResult  ();  }  /// <summary>  /// Concrete builder implementation  /// </summary>  public  class  GTBuilder  :  IBicycleBuilder  {  public  string  Color  {  get  ;  set  ;  }  public  int  Höjd  {  get  ;  set  ;  }  public  Bicycle  GetResult  ()  {  retur  Höjd  ==  29  ?  ny  cykel  (  "GT"  ,  "Avalanche"  ,  Färg  ,  Höjd  )  :  null  ;  }  }  /// <summary>  /// Regissören  /// </summary>  public  class  MountainBikeBuildDirector  {  privat  IBicycleBuilder  _builder  ;  public  MountainBikeBuildDirector  (  IBicycleBuilder  builder  )  {  _builder  =  builder  ;  }  public  void  Construct  ()  {  _builder  .  Färg  =  "Röd"  ;  _byggare  .  Höjd  =  29  ;  }  public  Bicycle  GetResult  ()  {  returnera  detta  .  _byggare  .  GetResult  ();  }  }  public  class  Client  {  public  void  DoSomethingWithBicycles  ()  {  var  director  =  new  MountainBikeBuildDirector  (  ny  GTBuilder  ());  // Director kontrollerar det stegvisa skapandet av produkten och returnerar resultatet.  Cykel  myMountainBike  =  regissör  .  Konstruera  ().  GetResult  ();  }  } 

Direktören sätter ihop en cykelinstans i exemplet ovan och delegerar konstruktionen till ett separat byggobjekt som har getts till direktören av beställaren.

Se även

  • Curry
  • FluentQueryBuilder
  1. ^ a b   Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides (1994). Designmönster: element i återanvändbar objektorienterad programvara . Addison Wesley. s. 97ff . ISBN 0-201-63361-2 . {{ citera bok }} : CS1 underhåll: flera namn: lista över författare ( länk )
  2. ^ "Byggmästarens designmönster - problem, lösning och tillämplighet" . w3sDesign.com . Hämtad 2017-08-13 .
  3. ^ a b "Index för /archive/2010/winter/51023-1/presentations" ( PDF) . www.classes.cs.uchicago.edu . Hämtad 2016-03-03 .
  4. ^ "Byggmästarens designmönster - struktur och samarbete" . w3sDesign.com . Hämtad 2017-08-12 .

externa länkar