工厂方法模式(Factory Method)
书中通过一个学雷锋的例子,来引出工厂方法模式。
工厂方法模式:定义了一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
工厂方法模式UMl类图:
工厂方法模式代码:
public abstract class LeiFeng { //要创建的对象的接口,这里因为要创建的对象的三个方法相同,所以我定义了一个抽象类,而没有定义接口
public void Sweep() {
System.out.println("扫地");
}
public void wash(){
System.out.println("洗衣");
}
public void buyRice(){
System.out.println("买米");
}
}
public class Student extends LeiFeng{//具体要实例化的对象---学生类
}
public class Volunteer extends LeiFeng{//具体要实例化的对象--社区员工类
}
学生和社区员工都要学习雷锋,来帮助老人扫地,洗衣,买米。
public interface IFactory {//用来创建实例化对象的接口
public LeiFeng createLerfent();//该方法返回一个具体的实例化对象,也就是具体学雷锋的对象
}
public class StudentFactory implements IFactory{//用来实例化具体对象的工厂方法类--该类用来实例化学生对象
@Override
public LeiFeng createLerfent() {//创建学雷锋对象方法,返回的是一个学生对象
LeiFeng student =new Student();
return student;
}
}
public class VolunteerFactory implements IFactory{//用来实例化具体对象的工厂方法类--该类用来实例化社区员工的对象
@Override
public LeiFeng createLerfent() {//创建学雷锋对象方法,返回的是一个社区员工对象
LeiFeng volunteer =new Volunteer();
return volunteer;
}
}
public class Main {
public static void main(String[] args) {
IFactory factory = new StudentFactory();//当需要创建社区员工时,只需要修改这里就可以了
LeiFeng xueLeiFeng = factory.createLerfent();
xueLeiFeng .Sweep();
xueLeiFeng .wash();
xueLeiFeng .buyRice();
}
}
总结:
工厂方法模式遵循了开放-封闭原则,其实它是将判断工作转移到了客户端调用之处,这样保证了工厂体系的完整性。而简单工厂模式需要在工厂类里来判断选择哪个类。