InsuranceProductIssuer.java
package com.designpatterns.creational.abstractfactory.applied;
/**
* Depends only on {@link InsuranceProductFactory} — never on a concrete document type or a
* concrete rate. Swapping the whole product family (domestic vs. international) is one
* constructor argument, not a chain of conditionals scattered through this class.
*/
public class InsuranceProductIssuer {
private final InsuranceProductFactory factory;
public InsuranceProductIssuer(InsuranceProductFactory factory) {
this.factory = factory;
}
public String issuePolicy(String policyholderName, long coverageAmountCents) {
PolicyDocument document = factory.createPolicyDocument();
PremiumCalculator calculator = factory.createPremiumCalculator();
long premiumCents = calculator.calculatePremiumCents(coverageAmountCents);
return document.render(policyholderName) + " | Premium: " + premiumCents + " cents";
}
}