上一篇我们讲到了工厂方法模式,而通过例子以及实践,原有的工厂方法模式有一个问题,那就是如果需要拓展方法就必须对工厂类进行修改,这就违背了闭包原则。因此,对于需求的不断变化,那应生新的方法去解决问题,这就引入了抽象工厂模式。而抽象工厂只是在原有的工厂方法就行了调整,多出了一个接口用于拓展,这样如果出现新的需求就不用去修改原来工厂接口了,具体还是用代码来说明。
首先还是搭建工厂接口:
public interface FactoryInter {
public void produce();
}
接着是两个实现:
public class BMWProduce implements FactoryInter{
@Override
public void produce() {
System. out.println("我生产的是宝马车" );
}
}
public class AudiProduce implements FactoryInter{
@Override
public void produce() {
System. out.println("我生产的是奥迪车" );
}
}
然后提供一个新的接口,用于满足新的需求,这里就不去修改原有的工厂接口了。
public interface CarFactoryInter {
public FactoryInter buildCar();
}
接着是两个工厂类:
public class BMWFactory implements CarFactoryInter{
@Override
public FactoryInter buildCar() {
// TODO Auto-generated method stub
return new BMWProduce();
}
}
public class AudiFactory implements CarFactoryInter{ @Override public FactoryInter buildCar() { // TODO Auto-generated method stub return new AudiProduce(); }}
最后是测试:
public class testAbstractFactory {
public static void main(String[] args) {
CarFactoryInter carFactory=new AudiFactory();
FactoryInter factory= carFactory.buildCar();
factory.produce();
}
}
得到的结果是:
我生产的是奥迪车
总结:这个抽象工厂看起来有点多此一举,为了新的方法而再去创建一个接口来实现。但在实际项目中这样做才符合了闭包原则,最简单的,最简单,两种车都需要上色,但是车型不同上色需要的材料以及方式都不一样,这时候就需要修改一下新的工厂类方法即可,就不用去修改之前的代码结构了。当然总归还是得根据实际项目需求进行吧,但鉴于可拓展性还是建议使用抽象工厂,虽然他看起来不是那么好理解。