什么是抽象工厂模式

上篇博客已经介绍了工厂模式,这里要介绍的是抽象工厂模式,它是工厂模式的父类工厂,可以创建其他的工厂。抽象工厂模式(Abstract Factory Pattern)是另一种软件开发设计模式。抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。抽象工厂模式其实就是在工厂模式之上增加了一层抽象的概念。

代码实现

  • 代码思路:

创建两个工厂分别是画图的工厂ShapeFactory和填充颜色的工厂ColorFactory,再创建超级工厂FactoryProducer通过这个超级工厂来创建这两个工厂 。

  • UML类图(结合UML类图代码逻辑更为清晰)

UML类图

1.定义形状接口,表示画不同形状的图形。实现它的3个类中都要实现它的 draw() 方法;同理定义颜色接口,表示为图形填充不同颜色
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
43
44
 
public interface Shape {
void draw();
}

public class Circle implements Shape {
public void draw(){
System.out.println("画圆");
}
}

public class Rectangle implements Shape {
public void draw(){
System.out.println("画长方形");
}
}

public class Square implements Shape {
public void draw(){
System.out.println("画正方形");
}
}

public interface Color {
void fill();
}

public class Blue implements Color {
public void fill(){
System.out.println("填充蓝色");
}
}

public class Green implements Color {
public void fill(){
System.out.println("填充绿色");
}
}

public class Red implements Color {
public void fill(){
System.out.println("填充红色");
}
}
2.定义形状工厂类,并在类中定义获取形状对象的方法,根据传入的参数创建不同的对象 equalsIgnoreCase() 是字符串的方法,可以忽略大小写比较字符串是否相等;颜色工厂类同理,根据传入的参数(颜色)创建不同的对象。
  • 首先定义一个抽象类,规定继承它的类必须实现的抽象方法
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
 
public abstract class AbstractFactory {
public abstract Color getColor(String color);
public abstract Shape getShape(String shap);
}

public class ShapeFactory extends AbstractFactory {
public Shape getShape(String shapeType){
if(shapeType == null) return null;
if(shapeType.equalsIgnoreCase("circle")){
return new Circle();
}else if(shapeType.equalsIgnoreCase("rectangle")){
return new Rectangle();
}else if(shapeType.equalsIgnoreCase("square")){
return new Square();
}
return null;
}
public Color getColor(String Color){
return null;
}
}


public class ColoreFactory extends AbstractFactory {
public Shape getShape(String shapType){
return null;
}
public Color getColor(String color){
if(color == null) return null;
if(color.equalsIgnoreCase("red")){
return new Red();
}else if(color.equalsIgnoreCase("green")){
return new Green();
}else if(color.equalsIgnoreCase("blue")){
return new Blue();
}
return null;
}
}
3.定义生成工厂类的类,即工厂类的构造器,通过传递形状或颜色信息来获取工厂。
1
2
3
4
5
6
7
8
9
10
11
 
public class FactoryProducer {
public static AbstractFactory getFatory(String choice){
if(choice.equalsIgnoreCase("shape")){
return new ShapeFactory();
}else if(choice.equalsIgnoreCase("color")){
return new ColoreFactory();
}
return null;
}
}
4.主类。使用 FactoryProducer(工厂类构造类) 来创建 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
 
public class AbstractFactoryPatternDemo {
public static void main(String[] args) {
//获取形状工厂
AbstractFactory shapeFactory = FactoryProducer.getFatory("shape");
//获取形状为Cirlce的对象
Shape shape1 = shapeFactory.getShape("circle");
// 画圆
shape1.draw();
//获取形状为 Rectangle 的对象
Shape shape2 = shapeFactory.getShape("RECTANGLE");
//调用 Rectangle 的 draw 方法
shape2.draw();


//获取颜色工厂
AbstractFactory colorFactory = FactoryProducer.getFatory("COLOR");
//获取颜色为 Red 的对象
Color color1 = colorFactory.getColor("RED");
//调用 Red 的 fill 方法
color1.fill();
//获取颜色为 Green 的对象
Color color2 = colorFactory.getColor("Green");
//调用 Green 的 fill 方法
color2.fill();
}
}

抽象工厂模式应用

抽象工厂模式适合的结构:产品分为几个系列,在每个系列中,产品的布局是类似的,在一个系列中的某个产品,在另一个系列中有一个与之对应的产品。而不同几个系列中同一位置的产品可能是互斥的。它们可以根据不同的客户提供不同的解决方案

小结

  • 工厂模式和抽象工厂模式区别:

为了弄清楚,先介绍两个概念:

产品等级结构:比如一个抽象类是食物,其子类有苹果、牛奶等等,则抽象食物与具体食物名称之间构成了一个产品等级结构。食物是抽象的父类,而具体的食物名称是其子类。

产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品。如上述代码中 生产的形状、颜色,长方形属于形状类等级结构中,而红色则属于颜色产品等级结构中。

工厂方法模式:针对 一个产品等级结构。

抽象工厂模式:针对 多个产品等级结构,即产品族。

投喂我

写文不易,如果本文对你有帮助,点击Donate,微信和支付宝投喂我