目录
1.工厂方法模式的概念
2.工厂方法模式的结构图
3.练习的例子结构图
4.练习的代码
雷锋类:
public class LeiFeng {
public void sweep(){
System.out.println("拖地");
}
public void wash(){
System.out.println("洗碗");
}
}
学雷锋的大学生:
public class Undergraduate extends LeiFeng{
@Override
public void sweep() {
super.sweep();
}
@Override
public void wash() {
super.wash();
}
}
学雷锋的社区志愿者:
public class Volunteer extends LeiFeng{
@Override
public void sweep() {
super.sweep();
}
@Override
public void wash() {
super.wash();
}
}
雷锋工厂接口:
interface LeiFengFactory {
LeiFeng createLeiFeng();
}
学雷锋的大学生制造工厂:
public class UndergraduateFactory implements LeiFengFactory{
@Override
public LeiFeng createLeiFeng() {
return new Undergraduate();
}
}
学雷锋的社区志愿者制造工厂:
public class VolunteerFactory implements LeiFengFactory{
@Override
public LeiFeng createLeiFeng() {
return new Volunteer();
}
}
客户端:
public class Test {
public static void main(String[] args) {
//我需要个学雷锋的大学生
//先制造 学雷锋的大学生工厂
LeiFengFactory leiFengFactory = new UndergraduateFactory();
//通过工厂来制造大学生
LeiFeng leiFeng = leiFengFactory.createLeiFeng();
leiFeng.sweep();
leiFeng.wash();
//志愿者同理
}
}
控制台:
5.总结
工厂方法克服了简单工厂违背开放-封闭原则的缺点,又保持了封装对象创建过程的优点。
工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。如果要加功能,本来是改工厂类的,而现在是修改客户端。
但是分支判断的问题还是存在,在之后的抽象工厂 + 反射部分会进一步讨论