什么是工厂方法模式
工厂方法模式: 定义一个用于创建对象的接口(IFactory),让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
简单工厂模式中的工厂类与分支耦合,那么根据依赖倒置原则,我们把工厂类抽象出一个接口,这个接口只有一个方法,就是创建抽象产品的工厂方法。然后,所有要生产具体类的工厂,就去实现这个接口,这样一个简单工厂模式的工厂类,变成了一个工厂抽象接口和多个具体生产对象的工厂。于是,当要新增“求m的n次方”的时候,就不需要更改原有的工厂类了,只需要增加此功能的运算类和相应的工厂类就可以了。
优点:
- 只是扩展变了变化,符合开方-封闭原则。工厂方法克服了简单工厂违背开方-封闭原则的缺点
- 降低了客户端和产品对象的耦合。工厂方法是简单工厂的进一步抽象和推广。
缺点:
- 客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的。即,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。
- 由于新增一个产品时,就需要增加一个产品工厂的类,增加了额外的开发量。
利用反射可以解决分支判断问题。
类图:
代码:
IFactory
public interface IFactory {
LeiFeng createLieFeng();
}
UnderGraduateFactory
public class UnderGraduateFactory implements IFactory {
@Override
public LeiFeng createLieFeng() {
return new UnderGraduate();
}
}
VolunteerFactory
public class VolunteerFactory implements IFactory {
@Override
public LeiFeng createLieFeng() {
return new Volunteer();
}
}
LeiFeng
public class LeiFeng {
public void sweep(){
System.out.println("扫地");
}
public void wash(){
System.out.println("洗衣");
}
public void buyRice(){
System.out.println("买大米");
}
}
UnderGraduate
public class UnderGraduate extends LeiFeng {
}
Volunteer
public class Volunteer extends LeiFeng {
}
Main
public class Main {
public static void main(String[] args) throws Exception {
//当需要创建社区志愿者的时候,只需要改着一句话即可。
IFactory iFactory=new UnderGraduateFactory();
LeiFeng student=iFactory.createLieFeng();
student.sweep();
student.buyRice();
student.wash();
}
}