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" abstractclass DataObject { //
Methods
abstractpublicvoid Connect();
abstractpublicvoid Select();
abstractpublicvoid Process();
abstractpublicvoid Disconnect(); //
The "Template Method"
publicvoid Run() { Connect(); Select(); Process(); Disconnect(); } } //
"ConcreteClass" class CustomerDataObject :
DataObject {
privatestring connectionString = "provider=Microsoft.JET.OLEDB.4.0;
" + "data
source=c:\\nwind.mdb";
privatestring commandString;
private DataSet
dataSet; //
Methods
publicoverridevoid Connect( ) { //
Nothing to do }
publicoverridevoid Select( ) { commandString =
"select CompanyName from Customers"; OleDbDataAdapter
dataAdapter = new
OleDbDataAdapter( commandString,
connectionString ); dataSet = new DataSet(); dataAdapter.Fill(
dataSet, "Customers" ); }
publicoverridevoid Process() { DataTable
dataTable = dataSet.Tables["Customers"];
foreach(
DataRow dataRow in
dataTable.Rows ) Console.WriteLine(
dataRow[ "CompanyName" ] ); }
publicoverridevoid Disconnect() { //
Nothing to do } } ///<summary> ///
TemplateMethodApp test ///</summary> publicclass TemplateMethodApp {
publicstaticvoid 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.