> For the complete documentation index, see [llms.txt](https://jun-wang.gitbook.io/learnjava/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://jun-wang.gitbook.io/learnjava/ji-shu-xue-xi/java-she-ji-mo-shi/gong-chang-he-chou-xiang-gong-chang-mo-shi.md).

# 工厂和抽象工厂模式

## 1. 简介

先来简单说一下什么是工厂模式和抽象工厂模式：

* 工厂模式：一般我们通过new创建一个产品类，为了简化操作我们可以创建一个工厂类，由这个工厂类负责创建所需要的产品；
* 抽象工厂模式：如果产品的种类多了，使用一个工厂可能不够，会导致逻辑复杂，可读性差等。这个时候我们可以定义一个工厂接口，通过多个工厂实现类来处理不同的产品。

## 2. 普通工厂

### 2.1 普通工厂UML

![](/files/-M7h5X2-GIo5LE4tFkFU)

### 2.2 普通工厂实例

产品接口：

```java
package com.wangjun.designPattern.factory;

public interface IProduct {

    public String info();

}
```

产品实现类：

```java
package com.wangjun.designPattern.factory;

public class Product1 implements IProduct {

    @Override
    public String info() {
        return "Product1";
    }

}
```

其余4个Product类一样，就不写了。

工厂类：

```java
package com.wangjun.designPattern.factory;

public class ProductFactory {

    public static IProduct createProduct(int type) {

        switch(type) {
            case 1:
                return new Product1();
            case 2:
                return new Product2();
            case 3:
                return new Product3();
            case 4:
                return new Product4();
            case 5:
                return new Product5();
            default:
                System.out.println("没有此型号的产品");
                return null;
        }
    }

}
```

测试类：

```java
package com.wangjun.designPattern.factory;

public class Main {

    public static void main(String[] args) {
         //根据传入的参数来创建具体的类
        IProduct product1 = ProductFactory.createProduct(1);
        System.out.println("产品名：" + product1.info());

        IProduct product2 = ProductFactory.createProduct(2);
        System.out.println("产品名：" + product2.info());

        IProduct product3 = ProductFactory.createProduct(3);
        System.out.println("产品名：" + product3.info());
    }

}
```

运行结果：

```java
产品名：Product1
产品名：Product2
产品名：Product3
```

## 3. 抽象工厂

### 3.1 抽象工厂示意图

![](/files/-M7h5X22BbtUT16hEMpd)

### 3.2 抽象工厂UML

![](/files/-M7h5X23N7V2viy8S9PK)

### 3.3 抽象工厂实例

工厂接口：

```java
package com.wangjun.designPattern.abstractFactory;

public interface IFactory {

    public IProduct createProduct(int type);

}
```

工厂实现类：

```java
package com.wangjun.designPattern.abstractFactory;

public class Factory1 implements IFactory {

    @Override
    public IProduct createProduct(int type) {
        System.out.println("工厂1生产");
        if(type == 1) {
            return new Product1();
        }else if(type == 2) {
            return new Product2();
        }else {
            System.out.println("不支持此类型的产品");
        }
        return null;
    }

}
```

工程2,3一样，就不写了。

产品接口：

```java
package com.wangjun.designPattern.abstractFactory;

public interface IProduct {

    public String info();

}
```

产品实现类：

```java
package com.wangjun.designPattern.abstractFactory;

public class Product1 implements IProduct {

    @Override
    public String info() {
        return "Product1";
    }

}
```

产品实现类2,3,4,5,6一样就不写了。

提供给外部调用的工程类：

```java
package com.wangjun.designPattern.abstractFactory;

public class ProductFactory {

    public static IProduct createProduct(int type) {
        IFactory factory = null;

        //1,2类型使用工厂1生成；3,4类型使用工厂2生产；5,6类型使用工厂3生产
        if(type >= 1 && type <= 2) {
            factory = new Factory1();
        }else if(type >=3 && type <= 4) {
            factory = new Factory2();
        }else if(type >= 5 && type <= 6) {
            factory = new Factory3();
        }else {
            System.out.println("不支持此类型的产品");
            return null;
        }

        IProduct product = factory.createProduct(type);

        return product;
    }

}
```

测试类：

```java
package com.wangjun.designPattern.abstractFactory;

public class Main {

    public static void main(String[] args) {
        IProduct product1 = ProductFactory.createProduct(1);
        System.out.println("产品名：" + product1.info());

        IProduct product2 = ProductFactory.createProduct(4);
        System.out.println("产品名：" + product2.info());

        IProduct product3 = ProductFactory.createProduct(5);
        System.out.println("产品名：" + product3.info());
    }

}
```

打印输出：

```
工厂1生产
产品名：Product1
工厂2生产
产品名：Product4
工厂3生产
产品名：Product5
```
