Java 基础
Java 容器
Java 并发
设计模式
目录

抽象工厂

# 抽象工厂(Abstract Factory)

# Intent

提供一个接口,用于创建 相关的对象家族 。

# Class Diagram

抽象工厂模式创建的是对象家族,也就是很多对象而不是一个对象,并且这些对象是相关的,也就是说必须一起创建出来。而工厂方法模式只是用于创建一个对象,这和抽象工厂模式有很大不同。

抽象工厂模式用到了工厂方法模式来创建单一对象,AbstractFactory 中的 createProductA() 和 createProductB() 方法都是让子类来实现,这两个方法单独来看就是在创建一个对象,这符合工厂方法模式的定义。

至于创建对象的家族这一概念是在 Client 体现,Client 要通过 AbstractFactory 同时调用两个方法来创建出两个对象,在这里这两个对象就有很大的相关性,Client 需要同时创建出这两个对象。

从高层次来看,抽象工厂使用了组合,即 Cilent 组合了 AbstractFactory,而工厂方法模式使用了继承。


# Implementation

package com.code.factory.example1;

public abstract class AbstractProductA {
	abstract protected void onProduct();
}
1
2
3
4
5
package com.code.factory.example1;

public abstract class AbstractProductB {
    abstract protected void onProduct();
}
1
2
3
4
5
package com.code.factory.example1;

public class ProductA1 extends AbstractProductA {
    protected void onProduct() {
        System.out.println(toString() + " : ProductA1");
    }
}
1
2
3
4
5
6
7
package com.code.factory.example1;

public class ProductA2 extends AbstractProductA {
    protected void onProduct() {
        System.out.println(toString() + " : ProductA2");
    }
}
1
2
3
4
5
6
7
package com.code.factory.example1;

public class ProductB1 extends AbstractProductB {
    protected void onProduct() {
        System.out.println(toString() + " : ProductB1");
    }
}
1
2
3
4
5
6
7
package com.code.factory.example1;

public class ProductB2 extends AbstractProductB {
    protected void onProduct() {
        System.out.println(toString() + " : ProductB2");
    }
}
1
2
3
4
5
6
7
package com.code.factory.example1;

public abstract class AbstractFactory {
    abstract AbstractProductA createProductA();
    abstract AbstractProductB createProductB();
}
1
2
3
4
5
6
package com.code.factory.example1;

public class CommonFactory1 extends AbstractFactory {
    AbstractProductA createProductA() {
        return new ProductA1();
    }

    AbstractProductB createProductB() {
        return new ProductB1();
    }
}
1
2
3
4
5
6
7
8
9
10
11
package com.code.factory.example1;

public class CommonFactory2 extends AbstractFactory {
    AbstractProductA createProductA() {
        return new ProductA2();
    }

    AbstractProductB createProductB() {
        return new ProductB2();
    }
}
1
2
3
4
5
6
7
8
9
10
11
package com.code.factory.example1;

public class Main {
    public static void main(String[] args) {
        AbstractFactory abstractFactory = new CommonFactory1();
        AbstractProductA productA = abstractFactory.createProductA();
        AbstractProductB productB = abstractFactory.createProductB();
        productA.onProduct();
        productB.onProduct();

        abstractFactory = new CommonFactory2();
        productA = abstractFactory.createProductA();
        productB = abstractFactory.createProductB();
        productA.onProduct();
        productB.onProduct();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
com.code.factory.example1.ProductA1@5e265ba4 : ProductA1
com.code.factory.example1.ProductB1@6d1e7682 : ProductB1
com.code.factory.example1.ProductA2@8807e25 : ProductA2
com.code.factory.example1.ProductB2@2a3046da : ProductB2
1
2
3
4

# JDK

  • javax.xml.parsers.DocumentBuilderFactory (opens new window)
  • javax.xml.transform.TransformerFactory (opens new window)
  • javax.xml.xpath.XPathFactory (opens new window)