设计模式之抽象工厂模式

      在上一篇博客里面,笔者讲到了工厂模式,相信看到的朋友就会感到奇怪,为什么这篇博客又来讲工厂模式呢?是不是重复了?到底工厂模式和抽象工厂模式有什么区别呢?下面就让我们带着这些问题开始进入今天的主题吧!

      首先我们来看看两者的具体定义是怎么说的,工厂模式的定义为:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。抽象工厂模式的定义为:为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。通过上面的定义,我们就能很明显发现它们之间的区别。上一篇博客实例里面,我们能够发现创建一个对象的时候,我们会将最终的子类对象传到工厂方法里面,从而能够创建出特定的子类对象。但是在抽象工厂模式里面则不是这样的,它只负责提供一个创建的入口,你想要创建什么对象就调用相应的方法就可以了,不需要传进特定的子类对象。下面笔者将通过一个实例来说明抽象工厂模式的具体使用。

      首先我们来定义一个产品接口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!

posted on 2016-07-01 08:18  蔡鸿军  阅读(361)  评论(0编辑  收藏  举报