工厂模式(简单工厂模式)快速理解

it2023-09-26  77

工厂模式

一个工厂类根据传入的参数,动态的决定应该创建哪一个产品类(产品类都继承或实现于一个父类或接口),自动创建并返回实例

使用场景

工厂类负责创建的对象较少,调用者只知道传入参数,对于如何创建对象的逻辑不关心

举例

例子中展示的是输入金额,计算实际应收金额

没有使用工厂模式之前是这样调用的:

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; } }

关系图:

角色说明

工厂类角色(CashFactory):本模式的核心,含有一定的商业逻辑和判断逻辑,用来创建产品抽象产品角色(ICash):一般指具体产品继承的父类或实现的接口具体产品角色(DiscountCash、NormalCash...):工厂类创建的就是这个角色的实例,实现抽象产品角色

优缺点

优点

调用者可以从直接创建具体产品对象的尴尬局面中摆脱出来与外界隔离开来,耦合性低

缺点

所有创建类都集中在工厂类,一旦增加或减少某个产品,需要频繁修改工厂类,无法动态扩展简单工厂通常使用静态方法,使得无法由子类继承
最新回复(0)