抽象工厂模式
介绍
为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
与工厂模式区别
工厂模式针对的是一个产品等级结构,而抽象工厂模式则是针对的多个产品等级结构,也就是说,工厂模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类。
抽象工厂模式所提供的一系列产品就组成一个产品族,而工厂方法提供的一系列产品为一个等级结构
实例
应用工厂本身就是一个抽象工厂,有多个产品等级结构,衍生自不同的接口或抽象类。
模型
使用方法
- 创建接口
interface IProductA{
public void function();
}
interface IProductB{
public void function();
}
- 创建实现接口的实体类
class ProductA1 implements IProductA{
public void function() {
}
}
class ProductA2 implements IProductA{
public void function() {
}
}
class ProductB1 implements IProductB{
public void function() {
}
}
class ProductB2 implements IProductB{
public void function() {
}
}
- 创建抽象工厂
abstract class Factory1{
abstract IProductA getProductA1();
abstract IProductB getProductB1();
}
abstract class Factory2{
abstract IProductA getProductA2();
abstract IProductB getProductB2();
}
- 创建具体工厂来生产相关产品
class ConcreteFactory1 extends Factory1{
public IProductA getProductA1() {
return new ProductA1();
}
public IProductB getProductB1() {
return new ProductB1();
}
}
class ConcreteFactory2 extends Factory2{
public IProductA getProductA2() {
return new ProductA2();
}
public IProductB getProductB2() {
return new ProductB2();
}
}
- 客户端根据需要获取产品实例
public class Client{
public void getProductInstance(){
Factory1 factory1 = new ConcreteFactory1();
IProductA productA1 = factory1.getProductA1();
IProductB productB1 = factory1.getProductB1();
productA1.function();
productB1.function();
Factory2 factory2 = new ConcreteFactory2();
IProductA productA2 = factory2.getProductA2();
IProductB productB2 = factory2.getProductB2();
productA2.function();
productB2.function();
}
}
优缺点
- 优点:符合开闭原则,可以在类的内部对产品族进行约束,当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
- 缺点:每增加一个产品,相应的也要增加一个子工厂,加大了额外的开发量