主题切换
简单工厂模式
一、原始代码存在的问题(咖啡门店案例)
原始实现
咖啡店CoffeeStore的orderCoffee方法内部直接写if-else判断创建咖啡:
java
public static Coffee orderCoffee(String type){
Coffee coffee = null;
if("american".equals(type)){
coffee = new AmericanCoffee();
}else if("latte".equals(type)){
coffee = new LatteCoffee();
}
coffee.addMilk();
coffee.addSugar();
return coffee;
}核心缺陷
- 违背开闭原则:新增摩卡、卡布奇诺等咖啡时,必须修改
orderCoffee方法的if-else分支; - 高耦合:业务门店直接依赖所有具体咖啡实现类,创建逻辑与业务逻辑混杂;
- 复用性差:多处需要创建咖啡时,重复复制if-else创建代码。
二、简单工厂模式核心定义
三大角色
- 抽象产品:抽象父类/接口(
Coffee),定义产品统一规范(getName()、addMilk()、addSugar()); - 具体产品:实现抽象产品的子类(
AmericanCoffee美式、LatteCoffee拿铁); - 具体工厂:单独工厂类
SimpleCoffeeFactory,提供唯一创建产品的方法createCoffee(String type),封装所有对象实例化逻辑。
UML结构关系
- 依赖(虚线箭头):
CoffeeStore门店依赖工厂、工厂依赖抽象咖啡Coffee; - 泛化(实线空心三角):
AmericanCoffee、LatteCoffee继承抽象Coffee; - 调用流程:门店下单 → 调用工厂创建咖啡 → 工厂返回对应咖啡实例。
三、案例完整代码实现
1. 抽象产品 Coffee
java
public abstract class Coffee {
public abstract String getName();
public void addMilk(){}
public void addSugar(){}
}2. 具体产品
java
// 美式咖啡
public class AmericanCoffee extends Coffee{
@Override
public String getName() {
return "美式咖啡";
}
}
// 拿铁咖啡
public class LatteCoffee extends Coffee{
@Override
public String getName() {
return "拿铁咖啡";
}
}3. 简单工厂类 SimpleCoffeeFactory
java
public class SimpleCoffeeFactory {
public Coffee createCoffee(String type){
Coffee coffee = null;
if("american".equals(type)){
coffee = new AmericanCoffee();
}else if("latte".equals(type)){
coffee = new LatteCoffee();
}
return coffee;
}
}4. 业务门店 CoffeeStore
java
public class CoffeeStore {
private SimpleCoffeeFactory factory = new SimpleCoffeeFactory();
public Coffee orderCoffee(String type){
Coffee coffee = factory.createCoffee(type);
coffee.addMilk();
coffee.addSugar();
return coffee;
}
}四、简单工厂模式优缺点
优点
- 解耦:业务层(门店)不再直接new具体产品,创建逻辑统一交给工厂;
- 代码复用:所有需要创建咖啡的地方统一调用工厂,无需重复创建逻辑;
- 职责单一:工厂只负责对象创建,门店只负责下单业务流程。
缺点
- 依然违反开闭原则:新增咖啡品类,必须修改工厂
createCoffee里的if-else; - 工厂类职责过重:所有产品创建逻辑集中在一个类,一旦创建逻辑出错,全部产品创建受影响;
- 产品类型过多时,工厂代码臃肿难以维护。
五、面试简答
问:什么是简单工厂模式,解决了什么问题,有什么缺点? 答:
- 组成:分为抽象产品、具体产品、工厂类三个角色,工厂封装所有对象实例化逻辑;
- 解决问题:将业务代码中分散的new创建逻辑抽离,解耦业务层与具体实现类,统一管理对象创建;
- 缺点:新增产品时必须修改工厂类代码,违背开闭原则,工厂类职责过于集中,维护成本高。