工厂方法模式是怎么变抽象工厂的

2023-07-08 17:14:01 浏览数 (1)

监考老师很好,下半年继续

继续上一回的工厂方法模式之后,我们进一步说一下抽象工厂。

Abstract Factory(抽象工厂)

特点

抽象工厂提供了一个创建一系列相关或相互依赖的接口,且无须指定它们具体的类。

大概结构

按照理解,自己在processOn里画了一个大概的结构,大家凑合的看。

其中

  • AbstractFactory 声明一个抽象对象的操作接口
  • ConcreteFactory 实现具体对象的操作
  • AbstractProduct 为一类对象声明接口
  • ConcreteProduct 定义一个相对应的产品对象,内部实现AbstractProduct
  • Client 仅使用由AbstractFactory 和 AbstractProduct 类声明的接口

与工厂方法相比,其实就在产品的抽象上多抽一个产品B,工厂接口中多定义个方法。

代码

按照结构图,创建Factory接口类,声明两个产品的接口方法。

代码语言:javascript复制
interface Factory {
    ProductA createProductA();

    ProductB createProductB();
}

实现类Factory上,创建FactoryA和FactoryB来实现createProduct方法,返回对应的类。

代码语言:javascript复制
class FactoryA implements Factory{

    @Override
    public ProductA createProductA(){
        return new ProductA1();
    }


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

}

class FactoryB implements Factory{

    @Override
    public ProductA createProductA(){
        return new ProductA2();
    }


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

}

声明两种产品的接口类ProductA 和ProductB

代码语言:javascript复制
interface ProductA {
   void method();
}

interface ProductB {
    void method();
}

以及对应的实现类

代码语言:javascript复制
class ProductA1 implements ProductA{

    @Override
    public void method()
    {
        System.out.println("产品A1");
    }
}

class ProductA2 implements ProductA{

    @Override
    public void method()
    {
        System.out.println("产品A2");
    }
}

class ProductB1 implements ProductB{

    @Override
    public void method()
    {
        System.out.println("产品B1");
    }
}

class ProductB2 implements ProductB{

    @Override
    public void method()
    {
        System.out.println("产品B2");
    }
}

Client作为Main函数进行创建工厂对象并创建类

代码语言:javascript复制
public static void main(String[] args)
{
    Factory factoryA = new FactoryA();
    ProductA productA = factoryA.createProductA();
    //打印 产品A1
    productA.method();

    Factory factoryB = new FactoryB();
    ProductB productB = factoryB.createProductB();
    //打印 产品B2
    productB.method();

}
适用性

它适用于

  • 独立于产品的创建,表示和组合时。
  • 由多个产品中的一个来配置时。
  • 提供一个产品库,仅显示接口而不是实现时。

结束

抽象工厂的每个方法看起来都像是工厂方法,且每个方法都被声明成抽象,由子类的方法进行覆盖和实现。

希望本文能对大家有所帮助,和了不起一起持续学习。

我是了不起
和我一起学习更多精彩知识!!!

0 人点赞