什么是工厂方法模式
工厂方法模式定义了一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到子类。 与简单工厂模式相比,在新加入产品时工厂模式不需要修改工厂类,符合开闭原则。而且简单工厂模式中存在大量的if…else…代码,工厂类过于庞大加大了维护难度。
工厂方法模式包含以下几个角色:
Product(抽象产品):定义产品的接口,是工厂模式所创建对象的公共父类。
ConcreteProduct(具体产品):实现了抽象产品接口,某种类型的具体产品由专门的具体工厂创建,具体工厂和具体产品之间一一对应。
Factory(抽象工厂):在抽象工厂类中声明了工厂方法,用于返回一个产品。
ConceteFactory(具体工厂):是抽象工厂的子类,实现了抽象工厂中定义的工厂方法。
工厂模式是简单工厂模式的延伸,继承了简单工厂模式的优点,也弥补了简单工厂模式的不足。
工厂方法模式的优缺点
优点
- 在工厂模式中,工厂方法用来创建产品,同时还隐藏了哪种具体产品类会被实例化,客户端只关心所需要的产品对应的工厂。
- 工厂自主决定创建哪种产品对象,如何创建则在具体工厂内部实现。
- 加入新产品时无需修改工厂类,无需修改其他产品类,符合开闭原则。
缺点
- 新增新的产品时需要增加对应的产品类,工厂类,随着类越来越多增加了系统的复杂度。
- 由于考虑系统的扩展性,需要引入抽象层,增加了系统的抽象性和理解难度。
工厂方法模式的适用场景
- 当一个类不知道所要创建的对象类的时候。
- 当一个类希望由他的子类来指定所创建的对象的时候。
工厂方法模式案例
// 购买扫地机器人
// 抽象产品
public interface SweepingRobot {
void orderRobot();
}
// 具体产品
public class XiaoMiRobot implements SweepingRobot {
@Override
public void orderRobot() {
System.out.println("购买小米扫地机器人。");
}
}
public class EcovacsRobot implements SweepingRobot {
@Override
public void orderRobot() {
System.out.println("购买科沃斯扫地机器人.");
}
}
// 选择一台扫地机器人
// 抽象工厂
public abstract class RobotFactory {
public abstract SweepingRobot chooseOne();
}
// 具体工厂
public class XiaoMiRobotFactory extends RobotFactory{
@Override
public SweepingRobot chooseOne() {
return new XiaoMiRobot();
}
}
public class EcovacsRobotFactory extends RobotFactory {
@Override
public SweepingRobot chooseOne() {
return new EcovacsRobot();
}
}
public static void main(String[] args) {
RobotFactory robotFactory = new XiaoMiRobotFactory();
robotFactory.chooseOne().orderRobot();;
robotFactory = new EcovacsRobotFactory();
robotFactory.chooseOne().orderRobot();;
}
工厂方法模式在源码中的应用
Object
public class Object {
// 重写 toString方法
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
......
}