工厂方法模式
简单工厂模式里无法避免的是一串一串的switc判断语句,工厂方法模式在一定程度上可以解决这个问题 维基百科
首先来一个UML图吧:
首先是一个要被生产的类接口,还是Car
public interface ICar {
public void run();
}
然后是生产Car的工厂接口
/**
* 工厂接口
* @author senninha
*
*/
public interface IFactory {
ICar createCar();
}
约定两个类实现了ICar接口,分别是MclarenCar,FerrariCar,代码就省略了
有多少个被生产对象实现类就需要有多少个工厂方法实现类
MclarenFactory
/**
* 工厂方法的实现类
* @author senninha
*
*/
public class MclarenFactory implements IFactory {
@Override
public ICar createCar() {
// TODO Auto-generated method stub
return new CarMclaren();
}
}
FerrariFactory
/**
* 工厂方法实现类
* @author senninha
*
*/
public class FerrariFactory implements IFactory {
@Override
public ICar createCar() {
// TODO Auto-generated method stub
return new CarFerrari();
}
}
测试类
public static void main(String[] args) {
// TODO Auto-generated method stub
IFactory mF = new MclarenFactory();
ICar m = mF.createCar();
IFactory fF = new FerrariFactory();
ICar f = fF.createCar();
m.run();
f.run();
}
来,回顾一下以上的写法和普通的写法有什么不同
如果是普通的写法,就是直接在Test方法里这么写:
ICar m = new MclarenCar();
ICar f = new FerrariCar();
这个时候,如果需要更改MclarenCar类里具体的方法的实现,该怎么办?
1.是直接修改调用的地方,药丸,如果多个地方都调用了怎么办,并且很多时候写的是工具类,给其他程序员调用的,怎么去改别人的代码?
2.直接修改MclarenCar类,这样就违背了开放-封闭原则
在这两者中间通过IFactory作"中介",这个时候只需要在IFactory的实现类里做文章即可.