一 为什么要工厂方法模式
1.1 简单工厂模式代码
经过上一篇博文对简单工厂的分析,已经体会到简单工厂所带来的遍历之处,依然考虑上一篇博文的例子:一个学生类,一个铅笔类,一个橡皮类,每名学生需要一支铅笔,一个橡皮:
public abstract class Stationery { public Stationery(){ } }
public class Eraser extends Stationery { public Eraser(){ System.out.println("制造橡皮"); } }
public class Pencil extends Stationery { public Pencil(){ System.out.println("制造铅笔"); } }
public class Factory { public Stationery createStationery(String type){ switch (type) { case "pencil": return new Pencil(); case "eraser": return new Eraser(); default: break; } return null; } }
public class Student { public static void main(String[] args){ Factory factory=new Factory(); Stationery pencil1=factory.createStationery("pencil"); Stationery eraser1=factory.createStationery("eraser"); } }
1.2 需求改变
现在学生长大了,除了铅笔盒橡皮还需要一支钢笔,修改代码如下:
(1)加入pen类
public class Pen extends Stationery{ public Pen(){ System.out.println("制造钢笔"); } }
(2)修改工厂方法
public class Factory { public Stationery createStationery(String type){ switch (type) { case "pencil": return new Pencil(); case "eraser": return new Eraser(); case "pen": //step2 return new Pen(); default: break; } return null; } }
(3)制造钢笔
public class Student { public static void main(String[] args){ Factory factory=new Factory(); Stationery pencil1=factory.createStationery("pencil"); Stationery eraser1=factory.createStationery("eraser"); Stationery pen1=factory.createStationery("pen"); } }
重点关注第二步,修改工厂方法,这明显不满足开放关闭原则,并且一个工厂既可以生产钢笔,又可以生产铅笔。。。显然不满足单一职责原则,看一下工厂方法模式:
二 工厂方法模式
2.1 原始的工厂方法模式
public abstract class Stationery { public Stationery(){ } }
public class Eraser extends Stationery { public Eraser(){ System.out.println("制造一块橡皮"); } }
public class Pencil extends Stationery { public Pencil(){ System.out.println("制造一支铅笔"); } }
public interface FactoryStationery { Stationery createStationery(); }
public class FactoryEraser implements FactoryStationery { @Override public Eraser createStationery() { return new Eraser(); } }
public class FactoryPencil implements FactoryStationery { @Override public Pencil createStationery() { return new Pencil(); } }
public class Student { public static void main(String[] args){ FactoryPencil factoryPencil=new FactoryPencil(); FactoryEraser factoryEraser=new FactoryEraser(); Pencil pencil1=factoryPencil.createStationery(); Eraser eraser1=factoryEraser.createStationery(); } }
直观上来看把工厂分离开了,各个工厂生产自己的物品,互不干涉。2.2 需求改变之后
三 总结与上述相同,现在需要加入一支钢笔:
(1)加入pen类
(2)加入pen的工厂public class Pen extends Stationery{ public Pen(){ System.out.println("制造钢笔"); } }
(3)制造钢笔public class FactoryPen implements FactoryStationery { @Override public Pen createStationery() { return new Pen(); } }
public class Student { public static void main(String[] args){ FactoryPencil factoryPencil=new FactoryPencil(); FactoryEraser factoryEraser=new FactoryEraser(); FactoryPen factoryPen=new FactoryPen(); Pencil pencil1=factoryPencil.createStationery(); Eraser eraser1=factoryEraser.createStationery(); Pen pen1=factoryPen.createStationery(); } }
3.1 分析
从上述过程可以看出,工厂方法将不同物品的工厂剥离出来,当加入新物品时,不用修改工厂,而是建立自己的工厂,实现了开放关闭原则和单一职责原则。
3.2 UML图
备注:个人见解,不一定正确!
3.3 工厂方法缺点
工厂方法缺点和不足见下一遍博客和抽象工厂一起分析。