「这是我参与11月更文挑战的第27天,活动详情查看:2021最后一次更文挑战」
工厂方法模式
上次介绍的简单工厂模式存在了一些缺点。
工厂方法模式是对简单工厂模式的进一步抽象化,满足开闭原则,是系统再不改变原来代码的情况下引进新的产品。工厂方法模式引入工厂等级结构,解决了简单工厂模式中工厂类职责过重的问题
工厂方法模式:通过定义一个工厂的父类(负责定义创建对象的公共接口)
工厂方法模式把类实例化的过程推迟到子类。工厂类不在负责所有产品的创建,给对对应实现的接口当添加新产品时,不需要修改工厂类的逻辑,只需要添加新的工厂子类。
实现
抽象工厂类,定义具体工厂的公共接口,调用者通过它访问具体工厂的工厂方法 getProduct() 来创建产品。
abstract class AbstractFactory {
abstract Product getProduct();
}
复制代码
抽象产品类,定义具体产品的公共接口,描述了产品的主要特性和功能。
abstract class Tea {
public abstract void makeTea();
}
复制代码
具体产品类,继承抽象产品类定义生产的具体产品
public class BlackTea extends Tea {
@Override
public void makeProduct() {
System.out.println("泡一壶红茶");
}
}
public class GreenTea extends Product {
@Override
public void makeProduct() {
System.out.println("泡一壶绿茶");
}
}
复制代码
具体工厂类,继承抽象工厂类完成具体产品的创建
public class BlackTeaFactory extends AbstractFactory {
public Tea getProduct() {
return new BlackTea();
}
}
public class GreenTeaFactory extends AbstractFactory {
public Tea getProduct() {
return new GreenTea();
}
}
复制代码
总结
优点
- 这种实现方式更加符合开闭原则,如果新增一种产品,则只需要增加对应的具体产品和相应的工厂子类就可以。
- 每个工厂只负责生产对应的product,符合单一职责原则。
- 没有使用静态方法,形成了可以继承的等级结构。
缺点
- 类的个数容易过多,增加复杂度
- 一个具体工厂只能生产一种产品,这一弊端抽象工厂模式可以解决。