“老张开车去东北 撞了 肇事司机耍流氓 跑了 多亏一个东北人 送到医院缝五针 好了 ……翠花,上酸菜”
“老张开车去东北”,OK,这里如果我们刻意的用OO思想来看的话,老张这次是开车去的,下次就有很可能开飞机去的……这里请允许我刻意的这样的思考这个问题,因为刻意的这样思考,我们可以从这句话发现两个蕴含的设计模式,一个是FactoryMethod,一个是AbstractFactory。
一、FactoryMethod
FactoryMethod模式
OK,回到这句歌词,正如上面所说的,这次开车,下次开飞机……所以我们要思考出一种不管是车还是飞机或者火车,我们的程序都能灵活的适应需求的变化,这里就会用到FactoryMethod模式。
1 public interface Moveable { 2 void run(); 3 }
1 public class Car implements Moveable { 2 3 @Override 4 public void run() { 5 System.out.println("car run"); 6 } 7 8 }
1 public class Plane implements Moveable { 2 3 @Override 4 public void run() { 5 System.out.println("plane fly"); 6 } 7 8 }
1 public abstract class VicheleFactory { 2 abstract Moveable create(); 3 }
1 public class CarFactory extends VicheleFactory { 2 3 @Override 4 public Moveable create() { 5 return new Car(); 6 } 7 8 }
1 public class PlaneFactory extends VicheleFactory { 2 3 @Override 4 public Moveable create() { 5 return new Plane(); 6 } 7 8 }
1 public class Test { 2 public static void main(String[] args) { 3 // VicheleFactory factory = new CarFactory(); 4 VicheleFactory factory = new PlaneFactory(); 5 Moveable m = factory.create(); 6 m.run(); 7 } 8 }
所有的工厂以及产品都有自己的父类,这个父类规定好自己的子类的方法特性,可以任意的扩展,这样测试类调用的时候只需要做小小的改动就可以响应需求的变化。
FactoryMethod类结构
由图可知,工厂和产品的父类处于相互平行的层次,而具体实现工厂和具体实现产品又是一种平行的层次,同时还存在一种生产关系。