Skip to content

抽象工厂模式 - 代码指南

本文档详细说明抽象工厂模式的代码实现和使用方法


一、项目结构

abstractFactory/
├── AbstractFactory.java      # 抽象工厂
├── ConcreateFactory1.java    # 具体工厂1
├── ConcreateFactory2.java    # 具体工厂2
├── ProductA.java             # 抽象产品A
├── ProductA1.java            # 具体产品A1
├── ProductA2.java            # 具体产品A2
├── ProductB.java             # 抽象产品B
├── ProductB1.java            # 具体产品B1
└── ProductB2.java            # 具体产品B2

二、代码详解

2.1 AbstractFactory - 抽象工厂

java
package com.linsir.designpattern.abstractFactory;

public interface AbstractFactory {
    ProductA createProductA();
    ProductB createProductB();
}

说明

  • 声明创建抽象产品对象的操作接口
  • 每个方法对应一种产品的创建

2.2 ConcreateFactory1 - 具体工厂1

java
package com.linsir.designpattern.abstractFactory;

public class ConcreateFactory1 implements AbstractFactory {
    @Override
    public ProductA createProductA() {
        return new ProductA1();
    }

    @Override
    public ProductB createProductB() {
        return new ProductB1();
    }
}

2.3 ConcreateFactory2 - 具体工厂2

java
package com.linsir.designpattern.abstractFactory;

public class ConcreateFactory2 implements AbstractFactory {
    @Override
    public ProductA createProductA() {
        return new ProductA2();
    }

    @Override
    public ProductB createProductB() {
        return new ProductB2();
    }
}

2.4 ProductA - 抽象产品A

java
package com.linsir.designpattern.abstractFactory;

public interface ProductA {
    void use();
}

2.5 ProductA1 - 具体产品A1

java
package com.linsir.designpattern.abstractFactory;

public class ProductA1 implements ProductA {
    @Override
    public void use() {
        System.out.println("使用产品A1");
    }
}

2.6 ProductA2 - 具体产品A2

java
package com.linsir.designpattern.abstractFactory;

public class ProductA2 implements ProductA {
    @Override
    public void use() {
        System.out.println("使用产品A2");
    }
}

2.7 ProductB - 抽象产品B

java
package com.linsir.designpattern.abstractFactory;

public interface ProductB {
    void eat();
}

2.8 ProductB1 - 具体产品B1

java
package com.linsir.designpattern.abstractFactory;

public class ProductB1 implements ProductB {
    @Override
    public void eat() {
        System.out.println("食用产品B1");
    }
}

2.9 ProductB2 - 具体产品B2

java
package com.linsir.designpattern.abstractFactory;

public class ProductB2 implements ProductB {
    @Override
    public void eat() {
        System.out.println("食用产品B2");
    }
}

三、使用示例

java
public class AbstractFactoryTest {
    public static void main(String[] args) {
        // 使用工厂1创建产品系列1
        AbstractFactory factory1 = new ConcreateFactory1();
        ProductA productA1 = factory1.createProductA();
        ProductB productB1 = factory1.createProductB();
        productA1.use();  // 输出:使用产品A1
        productB1.eat();  // 输出:食用产品B1

        // 使用工厂2创建产品系列2
        AbstractFactory factory2 = new ConcreateFactory2();
        ProductA productA2 = factory2.createProductA();
        ProductB productB2 = factory2.createProductB();
        productA2.use();  // 输出:使用产品A2
        productB2.eat();  // 输出:食用产品B2
    }
}

四、与工厂方法模式的区别

特性工厂方法模式抽象工厂模式
产品等级一个产品等级多个产品等级
工厂数量一个产品对应一个工厂一个产品系列对应一个工厂
复杂度较低较高
扩展性易于扩展新产品难以扩展新产品等级

五、相关文档

Released under the MIT License.