在上一篇博客里面,笔者讲到了工厂模式,相信看到的朋友就会感到奇怪,为什么这篇博客又来讲工厂模式呢?是不是重复了?到底工厂模式和抽象工厂模式有什么区别呢?下面就让我们带着这些问题开始进入今天的主题吧!
首先我们来看看两者的具体定义是怎么说的,工厂模式的定义为:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。抽象工厂模式的定义为:为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。通过上面的定义,我们就能很明显发现它们之间的区别。上一篇博客实例里面,我们能够发现创建一个对象的时候,我们会将最终的子类对象传到工厂方法里面,从而能够创建出特定的子类对象。但是在抽象工厂模式里面则不是这样的,它只负责提供一个创建的入口,你想要创建什么对象就调用相应的方法就可以了,不需要传进特定的子类对象。下面笔者将通过一个实例来说明抽象工厂模式的具体使用。
首先我们来定义一个产品接口Product:
public interface Product { void shareMethod(); void doSomething();}
然后我们再来定义两个具体的产品ProductA和ProductB,具体代码如下:
public class ProductA implements AbstractProductA { @Override public void shareMethod() { // TODO Auto-generated method stub } @Override public void doSomething() { // TODO Auto-generated method stub }}
public class ProductA2 implements AbstractProductA { @Override public void shareMethod() { // TODO Auto-generated method stub } @Override public void doSomething() { // TODO Auto-generated method stub }}
在这里我们省略了B产品的定义代码,方法同产品A是一样的。接下来我们是不是就应该开始定义抽象工厂了,代码如下:
public class Create1 extends AbstractCreator { @Override public AbstractProductA createProductA() { return new ProductA(); } @Override public AbstractProductB createProductB() { return new ProductB(); }}
public class Create2 extends AbstractCreator { @Override public AbstractProductA createProductA() { return new ProductA2(); } @Override public AbstractProductB createProductB() { return new ProductB2(); }}
最后我们在需要创建产品A、B的地方调用相应的Create方法就可以了。
通过上面的方法,我们能够很明显的发现:随着后面的产品组合的增加,我们将需要定义更多的ProductN和CreateN,因为创建者是随着产品的不同组合、不同数量发生变化的。这样的话,我们就需要同时修改多个地方,严重的违背了开闭原则,所以在使用抽象工厂模式的时候,针对多产品需要的场景慎用。
好了,今天的博客就到这里吧,see you!