Vai al contenuto

Ingegneria del Software - Factory method, Abstract factory

Pubblicato:

Descrizione dei design pattern Factory method, Abstract factory.

Factory method

Il design pattern Factory method è un design pattern creazionale.

Definisce un'interfaccia per la creazione di oggetti, delegando alle sottoclassi il compito di decidere quale tipo di oggetto istanziare.

Problema e soluzione

  • Il client non dovrebbe conoscere i tipi esatte e le dipendenze necessarie per svolgere operazioni che non gli competono
  • Possibilità di aggiungere componenti in maniera trasparente
  • Controllo centralizzato della creazione degli oggetti

  • Delegare la creazione degli oggetti ad un apposito factory method che può essere sovrascritto dalle sottoclassi
  • Possibilità di aggiungere in qualsiasi momento sottoclassi specializzate
  • La classe factory si può occupare di contare le risorse create e riallocarle

UML

Loading diagram...

Codice

// ConcreteCreator
public class ConcreteNumberCreator extends NumberCreator {
  @Override
  public Product factoryMethod(int number) {
    if ((number & 1) == 0)
      return new EvenNumber();
    else
      return new OddNumber();
  }
}
// ConcreteProductA
public class OddNumber implements Number {
  @Override
  public boolean isEven() { return false; }
}
// ConcreteProductB
public class EvenNumber implements Number {
  @Override
  public boolean isEven() { return true; }
}

Possibili applicazioni

  • Creazione di elementi di UI con stili differenti
  • Leggere da sorgenti diverse

Pro e contro

  • Nasconde la specializzazione di un interfaccia
  • Permette di gestire in maniera centralizzata la creazione di oggetti
  • Possibilità di aggiungere in qualsiasi momento sottoclassi senza complicare il client

  • Gerarchia di classi più complessa

Abstract factory

Il design pattern Abstract factory è un design pattern creazionale.

Definisce un’interfaccia per creare famiglie di oggetti che hanno qualche relazione senza specificare le loro classi concrete.

Problema e soluzione

  • Il client deve essere indipendente dalle classi utilizzate
  • Creazione di una serie di oggetti in maniera consistente

  • Lasciare che il factory si occupi di creare oggetti della stessa famiglia
  • Le sottoclassi del factory si specializzano in una famiglia specifica

UML

Loading diagram...

Codice Product

// ConcreteProductA1
public class CircleMinimize implements Shape {
  @Override
  public String draw() { return "(_)" }
}
// ConcreteProductA2
public class CircleClose implements Shape {
  @Override
  public String draw() { return "(X)" }
}
// ConcreteProductB1
public class SquareMinimize implements Shape {
  @Override
  public String draw() { return "[_]" }
}
// ConcreteProductB2
public class SquareClose implements Shape {
  @Override
  public String draw() { return "[X]" }
}

Codice factory

// ConcreteFactoryA
public class CircleCreator implements Creator {
  @Override
  public Shape getMinimize() { return new CircleMinimize(); }
  @Override
  public Shape getClose() { return new CircleClose(); }
}
// ConcreteFactoryB
public class SquareCreator implements Creator {
  @Override
  public Shape getMinimize() { return new SquareMinimize(); }
  @Override
  public Shape getClose() { return new SquareClose(); }
}

Possibili applicazioni

  • Creazione di elementi di UI con stili differenti
  • Sistemi di internazionalizzazione

Pro e contro

  • Certezza di produrre prodotti coerenti fra di loro
  • La creazione degli oggetti è centralizzata
  • Possibilità di aggiungere in qualsiasi momento sottoclassi senza complicare il client

  • Gerarchia di classi più complessa

Challenge

  • (Factory method) Gestione di più figure geometriche in base al numero di lati e/o angoli
  • (Abstract factory) Supportare un menù multilingua con un apposito AbstractFactory