雷锋依然在人间——工厂方法模式
工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
//雷锋
public class LeiFeng {
public void Sweep() {
System.out.println("扫地");
}
public void Wash() {
System.out.println("洗衣");
}
public void BuyRice() {
System.out.println("买米");
}
}
//学雷锋的大学生类,继承雷锋
public class Undergraduate extends LeiFeng{
}
//社区志愿者
public class Volunteer extends LeiFeng {
}
//雷锋工厂
public interface IFactory {
LeiFeng createLeiFeng();
}
//学雷锋的大学生工厂
public class UndergraduateFactory implements IFactory {
public LeiFeng createLeiFeng() {
return new Undergraduate();
}
}
//社区志愿者工厂
public class VolunteerFactory implements IFactory {
public LeiFeng CreateLeiFeng() {
return new Volunteer();
}
@Override
public LeiFeng createLeiFeng() {
return null;
}
}
//主函数
public class Main {
public static void main(String[] args) {
IFactory factory = new UndergraduateFactory();
LeiFeng student = factory.createLeiFeng();
student.BuyRice();
student.Sweep();
student.Wash();
}
}
工厂方法模式克服了简单工厂违背开放-封闭原则的缺点,又保持了封闭对象创建过程的优点。它们都是集中封闭了对象的创建,使得要更换对象时,不需要做大的改动就可以实现,降低客户程序与产品对象的耦合。工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。但缺点是由于每加一个产品,就需要加一个产品工厂的类,增加了额外的开发量,还是没有避免修改客户端的代码。不过利用‘反射’可以解决避免分支判断的问题。