说实话,工厂方法模式其实跟简单工厂模式很相似,就是修复了简单工厂的一些不符合开闭原则的bug,但如果你的项目比较小型,还是推荐简单工厂来比较简单方便,毕竟工厂方法还是有美中不足的地方。
现在有一个需求:编写一个学雷锋帮助老人的类。
我们使用简单工厂模式和工厂方法模式写,两个区别就在于界面类和工厂类,其余一样。
雷锋父类(包含了雷锋的方法,扫地,买米... ...)
package FactoryMethodPattern;
public class LeiFeng {
public void sweep(){
System.out.println("扫地");
}
public void wash(){
System.out.println("洗衣服");
}
public void buyRice(){
System.out.println("买米");
}
}
大学生子类
package FactoryMethodPattern;
public class Undergraduate extends LeiFeng{
}
社区志愿者子类(跟大学生一样的功能,工厂的两个两个零件)
package FactoryMethodPattern;
public class Volunteer extends LeiFeng{
}
简单工厂类(此类最大特点在于里面使用了switch选择实例化对象,当需要增加新对象比如“学雷锋的小学生”我们就需要修改工程类,修改类是违法开闭原则的,所以有问题!)
package FactoryMethodPattern;
public class SimpleFactory {
public static LeiFeng craeteLeiFeng(String type){
LeiFeng result = new LeiFeng();
switch(type){
case "学雷锋的大学生":
result = new Undergraduate();
break;
case "社区志愿者":
result =new Volunteer();
break;
}
return result;
}
}
工厂方法类(对比简单工厂类,将switch的对象分为不同的类,当需要增加对象时,只需要新增类就好了,符合开闭原则,缺点是增加产品工厂需要额外的开发量。)
package FactoryMethodPattern;
public interface IFactory {
LeiFeng CreateLieFeng();
}
class UndergraduateFactory implements IFactory{
@Override
public LeiFeng CreateLieFeng() {
// TODO Auto-generated method stub
return new Undergraduate();
}
}
class VolunteerFactory implements IFactory{
@Override
public LeiFeng CreateLieFeng() {
// TODO Auto-generated method stub
return new Volunteer();
}
}
界面类(printFrame1是简单工厂的界面,printFrame2是工厂方法的界面,差不多的)
package FactoryMethodPattern;
public class Main {
public void printFrame1(){
LeiFeng student = SimpleFactory.craeteLeiFeng("学雷锋的大学生");
student.buyRice();
student.sweep();
student.wash();
}
public void printFrame2(){
IFactory factory = new UndergraduateFactory();
LeiFeng student = factory.CreateLieFeng();
student.buyRice();
student.sweep();
student.wash();
}
public static void main(String[] args) {
Main main = new Main();
main.printFrame1();
System.out.println();
main.printFrame2();
}
}
使用方法:同样是为了更方便的实例化对象而产生的两个工厂,工厂方法编程风格更优良,但也有美中不足增加开销的缺点,但还是利大于弊。
Ending... ...
简单来说:
普通过程:new特定的对象,调用特定的方法;
模式过程:修补了简单工程模式里面,需要新增新方法的时候,需要修改源代码!!违反开闭原则,这里的措施是,要新增新方法,你就新增个新类吧。