设计模式之抽象工厂模式(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使用的子弹。- 类图
- 实例代码
- 类图
创建枪接口。
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...
- 抽象工厂的优点
抽象工厂模式除了具有工厂方法模式的优点外,最主要的优点就是可以在类的内部对产品族进行约束。所谓的产品族,一般或多或少的都存在一定的关联,抽象工厂模式就可以在类内部对产品族的关联关系进行定义和描述,而不必专门引入一个新的类来进行管理。 - 抽象工厂的缺点
产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的。 - 总结
无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。
最终目的都是为了解耦!解耦!!解耦!!!
参考书籍:设计模式之禅