抽象工厂模式

抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,抽象工厂模式可以生产多个等级的产品。

概念

产品等级:不同产品的种类就是不同的产品等级(电视机和洗衣机就是不同的产品等级)
产品族:一个具体工厂生产的不同等级的产品(工厂生产的电视机和洗衣机属于一个产品族)

产品等级和产品族

定义

一种为访问类提供一个创建一组相关或者相互依赖对象的接口,且访问类无需指定所需要产品的具体类就能得到同族的不同等级的产品。

抽象工厂模式类图

使用场景

1) 客户端不依赖于产品类实例如何被创建、实现
2) 强调一系列相关的产品(同一产品族)一起使用创建对象需要大量的代码
3) 提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。
一个对象族都有相同的约束,则可以使用抽象工厂模式。

实现

产品角色实现

抽象产品:Product,定义产品的规范,描述产品的主要特性和功能,抽象工厂模式有多个抽象产品。
具体产品:ConcreteProduct,实现抽象产品角色所定义的接口由具体工厂来创建,与具体工厂之间是一对多的关系。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public abstract Product{
//all product base filds & methods.
abstract int on();
abstract int off();
}

public abstract AbstractTvProduct extends Product{
abstract int switchChannel();
}

public abstract AbstractFridgeProduct extends Product{
abstract int increaseTemp();
abstract int decreaseTemp();
}

public HaierTVProduct extends AbstractTvProduct{

}

public HaierFridgeProduct extends AbstractFridgeProduct{

}

public TCLTVProduct extends AbstractTvProduct{

}

public TCLFridgeProduct extends AbstractFridgeProduct{

}

工厂角色实现

抽象工厂:Abstract Factory,提供了创建产品的接口,包含多个创建产品的方法,可以创建多个不同等级的产品。
具体工厂:实现抽象工厂中的多个抽象方法,完成具体产品的创建。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public interface IFactory{
Product createTV();
Product createFridge();
}


public class HaierFactory implements IFactory{
Product createTV(){
return new HaierTVProduct();
}
Product createFridge(){
return new HaierFridgeProduct();
}
}

public class TCLFactory implements IFactory{
Product createTV(){
return new TCLTVProduct();
}
Product createFridge(){
return new TCLFridgeProduct();
}
}

优缺点

  • 隔离了具体类的生成,使得客户并不需要知道什么被创建,具有良好的封装性。
  • 如果要扩展产品族(有新的工厂要生产电视和冰箱时)的时候,只需要增加具体的产品类和实现工厂方法即可,原有的代码不需要变动,符合开闭原则。
  • 如果要扩展产品等级时,从抽象产品到工厂类,原有的代码都需要变动,违背了开闭原则。

参阅:
抽象工厂模式(详解版)