Skip to content

Instantly share code, notes, and snippets.

@franreyes
Last active December 8, 2024 14:00
Show Gist options
  • Save franreyes/9e0e01e4c7e0a4b60f848c8b9b8745f0 to your computer and use it in GitHub Desktop.
Save franreyes/9e0e01e4c7e0a4b60f848c8b9b8745f0 to your computer and use it in GitHub Desktop.
Example extract and override factory method
class FileTransactionsRepository : ITransactionsRepository
{
// more code...
}
class Account
{
private ITransactionsRepository _transactionsRepository;
public Account()
{
var reader = new ModelReader(Config.TransactionsFileLocation);
var persister = new XmlStore(Config.TransactionsFileLocation);
this._transactionsRepository = new FileTransactionsRepository(reader, persister);
// more code...
}
// more code...
}
//////////////////////////////////////////////
// After extracting the factory method,
// you can apply override the factory method
class Account
{
private ITransactionsRepository _transactionsRepository;
public Account()
{
// extracted a factory method
this._transactionsRepository = CreateTransactionsRepository();
// more code...
}
// factory method
private ITransactionsRepository CreateTransactionRepository()
{
var reader = new ModelReader(Config.TransactionFile);
var persister = new XmlStore(Config.TransactionFile);
return new FileTransactionsRepository(reader, persister);
}
// more code...
}
//////////////////////////////////////////////
// After applying Subclass & Override Factory Method
class Account
{
private ITransactionsRepository _transactionsRepository;
public Account()
{
this._transactionsRepository = CreateTransactionsRepository();
// more code...
}
// made protected for testing :(
protected virtual ITransactionsRepository CreateTransactionRepository()
{
var reader = new ModelReader(Config.TransactionFile);
var persister = new XmlStore(Config.TransactionFile);
return new FileTransactionsRepository(reader, persister);
}
// more code...
}
//////////////////////////////////////////////
class ForTestingAccount : Account
{
protected override ITransactionsRepository CreateTransactionRepository()
{
return new FakeTransactionRepository();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment