It has to be integrated with different front end systems.And each front-end has different way to create invoices .
Lets have a generic interface -
public interface CreateInvoice(){
public Invoice create();
}
Now a concrete implementation -
public classs CreateInvoiceForTwoDates implements CreateInvoice{
private Date fromDate ;
private Date toDate;
//Spring container created bean
@Autowired
private InvoiceItemRepository invoiceItemRepository;
public CreateInvoiceForTwoDates(Date fromDate,Date toDate){
this.fromDate = fromDate;
this.toDate = toDate;
}
public Invoice create(){
invoiceItemRepositoty.getInvoiceItem(fromDate,toDate);
//other code
}
}
now lets have a factory to create Invoice --
public class SimpleInvoiceFactory {
@Autowired
org.springframework.beans.factory.config.AutowireCapableBeanFactory beanFactory;
public createInvoice(InvoiceCreationCriteria criteria){
CreateInvoiceForTwoDates creatInvoiceForTwoDates =
new CreateInvoiceForTwoDates(criteria.fromDate,criteria.toDate);
//Now to set spring created bean InvoiceItemRepository into creatInvoiceForTwoDates
//we have to do
beanFactory.autowire(creatInvoiceForTwoDates);
creatInvoiceForTwoDates.create();
}
}