工厂模式
一个工厂类根据传入的参数,
动态的决定应该创建哪一个产品类
(产品类都继承或实现于一个父类或接口),自动创建并返回实例
使用场景
工厂类负责创建的对象较少,调用者只知道传入参数,对于如何创建对象的逻辑不关心
举例
例子中展示的是输入金额,计算实际应收金额
没有使用工厂模式之前是这样调用的:
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...)
:工厂类创建的就是这个角色的实例,实现抽象产品角色
优缺点
优点
- 调用者可以从
直接创建具体产品对象
的尴尬局面中摆脱出来 - 与外界隔离开来,
耦合性低
缺点
- 所有创建类都集中在工厂类,一旦增加或减少某个产品,需要
频繁修改
工厂类,无法动态扩展 - 简单工厂通常使用静态方法,使得无法由子类
继承