一个工厂类根据传入的参数,动态的决定应该创建哪一个产品类(产品类都继承或实现于一个父类或接口),自动创建并返回实例
工厂类负责创建的对象较少,调用者只知道传入参数,对于如何创建对象的逻辑不关心
例子中展示的是输入金额,计算实际应收金额
没有使用工厂模式之前是这样调用的:
RebateCash rebateCash = new RebateCash(300,100); double result = rebateCash.acceptCash(300); System.out.println("result = " + result);使用了之后,调用是这样的:
ICash cs = CashFactory.createCashAccept("打8折"); double result = cs.acceptCash(300); System.out.println("result = " + result);接下来查看具体的代码:
/** * 现金工厂 * * @author 游四七 * @date 2020/10/20 */ public class CashFactory { /** * 创建cash * * @param type * @return */ public static ICash createCashAccept(String type) { ICash cash = null; // 创建的对象可能需要很多步骤,这里统一一个地方创建并返回对象 switch (type) { case "正常收费": cash = new NormalCash(); case "打8折": cash = new DiscountCash(8); case "满300减100": cash = new RebateCash(300, 100); default: break; } return cash; } } /** * 计算金额的接口 * * @author 游四七 * @date 2020/10/20 */ public interface ICash { /** * 计算应收的费用 * * @param money 接收的钱 * @return 实际收的钱 */ double acceptCash(double money); } /** * 正常收费 * * @author 游四七 * @date 2020/10/20 */ public class NormalCash implements ICash{ @Override public double acceptCash(double money) { return money; } } /** * 返利 * * @author 游四七 * @date 2020/10/20 */ public class RebateCash implements ICash { /** * 满多少 */ private double moneyCondition; /** * 返利金额 */ private double rebateMoney; public RebateCash(double moneyCondition, double rebateMoney) { this.moneyCondition = moneyCondition; this.rebateMoney = rebateMoney; } @Override public double acceptCash(double money) { if (money >= moneyCondition) { return money - rebateMoney; } return money; } } /** * 打折 * * @author 游四七 * @date 2020/10/20 */ public class DiscountCash implements ICash { /** * 折扣率 */ private double moneyRebate; /** * 折扣率 * * @param moneyRebate */ public DiscountCash(double moneyRebate) { this.moneyRebate = moneyRebate; } @Override public double acceptCash(double money) { return money * moneyRebate; } }关系图: