‹header›
‹date/time›
Click to edit Master text styles
Second level
Third level
Fourth level
Fifth level
‹footer›
‹#›
27
28
Obstáculo: a definição de uma variável global deixa a instância (objeto) acessível mas não inibe a instanciação múltipla e proíbe o polimorfismo.
O uso deste padrão garante que para uma classe específica só possa existir uma única instância, a qual é acessível de forma global e uniforme.
O suporte a novos tipos de produtos é dificultado, já que a interface da Fábrica Abstrata fixa o conjunto de produtos que podem ser criados. Para dar suporte a novos tipos de produtos, é necessário alterar a interface da fábrica, o que envolve alterações na Fábrica Abstrata e em todas as suas subclasses.
Promove consistência entre produtos. Quando objetos-produto em uma família são projetados para trabalhar juntos, é importante que uma aplicação utilize apenas objetos desta família.

using System;
using System.Data;
using System.Data.OleDb;

// "AbstractClass"

abstract class DataObject
{
  // Methods
  abstract public void Connect();
  abstract public void Select();
  abstract public void Process();
  abstract public void Disconnect();

  // The "Template Method"
  public void Run()
  {
    Connect();
    Select();
    Process();
    Disconnect();
  }
}

// "ConcreteClass"

class CustomerDataObject : DataObject
{
  private string connectionString =
          "provider=Microsoft.JET.OLEDB.4.0; "
          + "data source=c:\\nwind.mdb";
  private string commandString;
  private DataSet dataSet;
 
  // Methods
  public override void Connect( )
  {
    // Nothing to do
  }

  public override void Select( )
  {
    commandString = "select CompanyName from Customers";
    OleDbDataAdapter dataAdapter = new OleDbDataAdapter(
               commandString, connectionString );
    dataSet = new DataSet();
    dataAdapter.Fill( dataSet, "Customers" );
  }

  public override void Process()
  {
    DataTable dataTable = dataSet.Tables["Customers"];
    foreach( DataRow dataRow in dataTable.Rows )
      Console.WriteLine( dataRow[ "CompanyName" ] );
  }

  public override void Disconnect()
  {
    // Nothing to do
  }
}

/// <summary>
///  TemplateMethodApp test
/// </summary>
public class TemplateMethodApp
{
  public static void Main( string[] args )
  {
    CustomerDataObject c = new CustomerDataObject( );
    c.Run();

  }
}
Implementação: Encapsular a classe preexistente em uma outra classe. O adaptador define a interface desejada e ativa os métodos da classe encapsulada.