定义
提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,它是一种对象创建型模式。
简而言之,就是工厂不在只生产面包,它同时还可以生产辣条,糖果等食品,转型成一个食品工厂。可以生产多种食品类产品,就是说从单一食品种类面包生产,到支持多种类型的食品生产的工厂。
UML类图
代码实现
ProductA.java
public abstract class ProductA {
public abstract void methodA();
}
ProductB.java
public abstract class ProductB {
public abstract void methodB();
}
Factory.java
public abstract class Factory {
public abstract ProductA methodFactoryA();
public abstract ProductB methodFactoryB();
}
ConcreteProductA1.java
public class ConcreteProductA1 extends ProductA {
@Override
public void methodA() {
System.out.println("method: ConcreteProductA1");
}
}
ConcreteProductA2.java
public class ConcreteProductA2 extends ProductA {
@Override
public void methodA() {
System.out.println("method: ConcreteProductA2");
}
}
ConcreteProductB1.java
public class ConcreteProductB1 extends ProductB {
@Override
public void methodB() {
System.out.println("method: ConcreteProductB1");
}
}
ConcreteProductB2.java
public class ConcreteProductB2 extends ProductB {
@Override
public void methodB() {
System.out.println("method: ConcreteProductB2");
}
}
ConcreteFactory1.java
public class ConcreteFactory1 extends Factory {
@Override
public ProductA methodFactoryA() {
return new ConcreteProductA1();
}
@Override
public ProductB methodFactoryB() {
return new ConcreteProductB1();
}
}
ConcreteFactory2.java
public class ConcreteFactory2 extends Factory {
@Override
public ProductA methodFactoryA() {
return new ConcreteProductA2();
}
@Override
public ProductB methodFactoryB() {
return new ConcreteProductB2();
}
}
Main.java
Factory factory = new ConcreteFactory1();
ProductA productA = factory.methodFactoryA();
ProductB productB = factory.methodFactoryB();
productA.methodA();
productB.methodB();
factory = new ConcreteFactory2();
productA = factory.methodFactoryA();
productB = factory.methodFactoryB();
productA.methodA();
productB.methodB();
优缺点
主要优点
-
抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就变得相对容易,所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。
-
当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。
-
增加新的产品族很方便,无须修改已有系统,符合“开闭原则”。
主要缺点
- 增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,这显然会带来较大的不便,违背了“开闭原则”。