设计模式之抽象工厂模式

定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。在工厂模式的基础上,在工厂层面在封装一层(简单工厂只在产品上包装一层)。抽象工厂模式适用于对“一系列相互依赖的对象”的创建工作,这些对象是相互依赖的,是有联系的。如果仅为一个对象的创建则用简单工厂模式或工厂方法模式完全可以实现,没有必要用抽象工厂模式。

角色:
抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。
具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象,生成一系列具体的产品
抽象产品角色:它是具体产品继承的父类或者是实现的接口。
具体产品角色:具体工厂角色所创建的对象就是此角色的实例。

优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。这是因为抽象工厂几乎确定了可以被创建的产品集合,支持新种类的产品就需要扩展该工厂接口,这将涉及抽象工厂类及其所有子类的改变。

使用:以下例子,通过抽象工厂AbstractFactory实例化具体工厂,通过抽象产品Shape实例化具体产品,之间通过两个参数颜色、颜色值或者形状、形状值确定最终的产品。
1.为形状创建接口,创建实现接口的实体类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public interface Shape 
{
void draw();
}
public class Rectangle: Shape
{
public void draw()
{
System.out.println("Inside Rectangle::draw() method.");
}
}
public class Square: Shape
{
public void draw()
{
System.out.println("Inside Square::draw() method.");
}
}

2.为颜色创建接口,创建实现接口的实体类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public interface Color 
{
  void draw();
}
public class Red: Color
{
public void draw()
    {
      System.out.println("Inside Red::draw() method.");
    }
}
public class Green: Color
{
public void draw()
    {
      System.out.println("Inside Green::draw() method.");
    }
}

3.为 Color 和 Shape 对象创建抽象类来获取工厂。AbstractFactory

public abstract class AbstractFactory
{
abstract Color getColor(String color);
abstract Shape getShape(String shape) ;
}
4.创建扩展了 AbstractFactory 的工厂类,基于给定的信息生成实体类的对象。

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
31
32
33
34
35
36
37
38
39
40
41
42
public class ShapeFactory : AbstractFactory
{
public Override Shape getShape(String shapeType)
{
if(shapeType == null){ return null; }

if(shapeType.equalsIgnoreCase("CIRCLE"))
{
return new Circle();
}
else if(shapeType.equalsIgnoreCase("RECTANGLE"))
{
return new Rectangle();
}
return null;
}

Override Color getColor(String color) { return null; }
}

public class ColorFactory extends AbstractFactory
{
public Override Shape getShape(String shapeType)
{ return null; }

Override Color getColor(String color)
{
if(color == null){
return null;
}
if(color.equalsIgnoreCase("RED"))
{
return new Red();
}
else if(color.equalsIgnoreCase("GREEN"))
{
return new Green();
}
}
return null;
}
}

5.创建一个工厂创造器/生成器类,通过传递形状或颜色信息来获取工厂。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class FactoryProducer 
{
public static AbstractFactory getFactory(String choice)
{
if(choice.equalsIgnoreCase("SHAPE"))
{
return new ShapeFactory();
}
else if(choice.equalsIgnoreCase("COLOR"))
{
return new ColorFactory();
}
return null;
}
}

6.实例化:

AbstractFactory shapeFactory = FactoryProducer.getFactory(“SHAPE”);
AbstractFactory colorFactory = FactoryProducer.getFactory(“COLOR”);