设计模式之抽象工厂模式(Abstract Factory Pattern)

  • 抽象工厂模式定义
    • Provide an interface for creating families of related or dependent objects without specifying their concrete classes. 为创建一组相关或相互依赖的对象提供一个接口,而且无须指定他们的具体类。
  • 抽象工厂模式和工厂模式的区别
    • 抽象工厂模式是针对的多个产品等级结构。简单来说就是多维度的,因为可以提供多种类型的多种规格的产品。
    • 工厂模式是针对的是一个产品等级结构。简单来说就是单维度的,只可以提供一种类型的多种规格的产品。
    • 在抽象工厂模式中,有一个产品族的概念。所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族
  • 抽象工厂模式实例
    相信很多男孩子都喜欢枪,其实笔者也很喜欢枪,可以说还是很痴迷呢。我们假设现在存在AK、M4A1两类枪,每一种枪对应一种子弹。我们现在这样考虑生产AK的工厂可以顺便生产AK使用的子弹,生产M4A1的工厂可以顺便生产M4A1使用的子弹。
    • 类图
      设计模式之抽象工厂模式(Abstract Factory Pattern)
    • 实例代码

创建枪接口。

public interface IGun {
	
	void shoot();
}

创建子弹接口。

public interface IBullet {

	void load();
}

创建AK类。

public class AK implements IGun{

	@Override
	public void shoot() {
		
		System.out.println("AK shoot...");
	}
}

创建M4A1类。

public class M4A1 implements IGun{

	@Override
	public void shoot() {
		
		System.out.println("M4A1 shoot...");
	}
}

创建AK子弹类。

public class AKBullet implements IBullet{

	@Override
	public void load() {
		System.out.println("load AK bullet...");
	}
}

创建M4A1子弹类。

public class M4A1Bullet implements IBullet{

	@Override
	public void load() {
		System.out.println("load M4A1 bullet...");
	}
}

创建工厂接口。

public interface Factory {
	IGun productGun();
	IBullet productBullet();
}

接下来生产枪支和子弹。
生产AK和子弹。

public class AK_Factory implements Factory{

	@Override
	public IGun productGun() {
		return new AK();
	}

	@Override
	public IBullet productBullet() {
		return new AKBullet();
	}

}

生产M4A1和子弹。

public class M4A1_Factory implements Factory{

	@Override
	public IGun productGun() {
		return new M4A1();
	}

	@Override
	public IBullet productBullet() {
		return new M4A1Bullet();
	}
}

经过上述的步骤(假设这就是生产枪支和弹药的流程)我们的枪支和子弹就生产好了,接下来就可以开枪射击了,想想还挺爽。

public class FactoryTest {

	@Test
	public void test() {
		Factory factory = new AK_Factory();
		IBullet bullet = factory.productBullet();
		IGun gun = factory.productGun();
		bullet.load();
		gun.shoot();
	}
}

输出结果

load AK bullet...
AK shoot...
  • 抽象工厂的优点
    抽象工厂模式除了具有工厂方法模式的优点外,最主要的优点就是可以在类的内部对产品族进行约束。所谓的产品族,一般或多或少的都存在一定的关联,抽象工厂模式就可以在类内部对产品族的关联关系进行定义和描述,而不必专门引入一个新的类来进行管理。
  • 抽象工厂的缺点
    产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的。
  • 总结
    无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。

最终目的都是为了解耦!解耦!!解耦!!!

参考书籍:设计模式之禅