简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。但是在增加功能时,需要在原来的工厂类的方法里增加代码,修改原有的类,也就是说不但对扩展开放了,也对修改开放了,违背了开放-封闭原则。
工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法模式使一个类的实例化延迟到其子类。
本设计模式通过学生和社区志愿者学雷锋的场景来模拟如下:
LeiFeng类:
package chapter8;
public class LeiFeng {
public void Sweep() {
System.out.println("扫地");
}
public void Wash() {
System.out.println("洗衣");
}
public void BuyRice() {
System.out.println("买米");
}
}
继承类:
package chapter8;
public class Undergraduate extends LeiFeng {
}
package chapter8;
public class Volunteer extends LeiFeng {
}
工厂类:
package chapter8;
public class UndergraduateFactory implements IFactory {
@Override
public LeiFeng CreateLeiFeng() {
return new Undergraduate();
}
}
package chapter8;
public class VolunteerFactory implements IFactory {
@Override
public LeiFeng CreateLeiFeng() {
return new Volunteer();
}
}
客户端模拟类:
package chapter8;
public class Terminal {
public static void main(String[] args) {
IFactory factory = new UndergraduateFactory();
LeiFeng stu = factory.CreateLeiFeng();
stu.BuyRice();
stu.Sweep();
stu.Wash();
}
}