Associação e Interface (Abstract Factory)

Olá amigos,

Nao sei nada de UML e Design Patterns, a unica coisa que sei é que tenho que desenvolver um sistema e gostari de fazer em java, e não apenas fazer … tem que ser uma coisa legal e utilizando alguns padrões e coisas lógicas.

Estou tendo dificuldade no relacionamento entre classes no meu projeto.

Vejam soh:
Cliente -> Atributos de cliente.
ClienteDAO -> Interface entre a classe Cliente e o JDBC.

até aqui blz … tenho outras diversas classes que seguem o mesmo esquema de implementação … o ruim eh que os meus clientes possuem algumas rotinas que são iguais mas implementadas diferente. O design pattern abstract factory poderia me auxiliar na separação destas implementações diferentes, mas como eu relacionaria a classe modelo Cliente com a classe ClienteFactory ???

Exemplo da minha tentativa.


Cliente

  • id
  • nome
    … etc


ClienteDAO


  • getClientes(): List
  • getCliente(id:int): Cliente
  • insert(cliente:Cliente)
    … etc


ClienteFactory

  • OperacaoA
  • OperacaoB


ClienteBradesco

  • OperacaoA
  • OperacaoB


ClienteItau

  • OperacaoA
  • OperacaoB

Reparem que ClienteBradesco e ClienteItau tambem deveriam ser clientes, e quando, em uma parte do meu sistema, o usuário selecionar o cliente Itau em uma combo box, preenchida pela tabela cliente do banco de dados, o método OperacaoA() deva ser chamado.

Esta é minha difilculdade … relacionar estas classes …

Obrigado pela atenção de voces …
Rodrigo A da Costa

lá vai um exemplo :

// AbstractProductA
abstract class Herbivore {}

// AbstractProductB
abstract class Carnivore {
	// Methods
	abstract public void Interact ( Herbivore a );
}

// AbstractFactory
abstract class ContinentFactory {
	// Methods
	abstract public Herbivore CreateHerbivore();
	abstract public Carnivore CreateCarnivore();
}

// ProductA1
class Wildebeest extends Herbivore {}

// ProductB1
class Lion extends Carnivore {

	// Methods
	public void Interact ( Herbivore h )
	{
		System.out.println (
			this.toString().substring(0, this.toString().indexOf('@'))
			+ " eats " +
			h.toString().substring(0, h.toString().indexOf('@'))
		);
	}
}

// ConcreteFactory1
class AfricaFactory extends ContinentFactory {

	// Methods
	public Herbivore CreateHerbivore()
	{
		return new Wildebeest();
	}

	public Carnivore CreateCarnivore()
	{
		return new Lion();
	}

}
	
// ProductA2
class Bison extends Herbivore {}

// ProductB2
class Wolf extends Carnivore {

	// Methods
	public void Interact ( Herbivore h )
	{
		System.out.println (
				this.toString().substring(0, this.toString().indexOf('@'))
				+ " eats " +
				h.toString().substring(0, h.toString().indexOf('@'))
		);
	}
}

// ConcreteFactory2
class AmericaFactory extends ContinentFactory {

	// Methods
	public Herbivore CreateHerbivore()
	{
		return new Bison();
	}

	public Carnivore CreateCarnivore()
	{
		return new Wolf();
	}
}

// Client
class Environment {

	private Herbivore Herbivore;
	private Carnivore Carnivore;

	public Environment ( ContinentFactory factory )
	{
		Carnivore = factory.CreateCarnivore();
		Herbivore = factory.CreateHerbivore();
	}

	public void Run()
	{
		Carnivore.Interact ( Herbivore );
	}
}

// Body
public class Abstract_Real {

	// Main method
	public static void main (String[] args) {
		ContinentFactory factory1 = new AfricaFactory();
		Environment e1 = new Environment ( factory1 );
		e1.Run();

		ContinentFactory factory2 = new AmericaFactory();
		Environment e2 = new Environment ( factory2 );
		e2.Run();
	}
}