抽象工厂

不想你离开。 提交于 2021-02-03 11:44:02

1.1 定义

  • 为创建一组相关或互相依赖的对象提供一个接口,并且无需指定他们的具体类。
  • 抽象工厂模式是工厂方法模式的升级版,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。

1.2 角色

  • UML
  • AbstractFactory :抽象工厂角色,它声明一组用于创建一种产品的方法,每一个方法对应一种产品,如上图中的 AbstractFactory 中就定义了两个方法,分别创建产品 A 和产品B。
  • ConcreteFactory : 具体工厂角色,它实现了在抽象工厂中定义的创建产品的方法,生成一组具体产品,这些产品构成了一个产品种类,每一个产品都位于某个产品等级结构中,如上述类图中的 ConcreteFactory1 、ConcreteFactory2。
  • AbstractProduct: 抽象产品角色,它为每种产品声明接口,比如上述类图中的 AbstractProduct A, AbstractProduct B。
  • ConcreteProduct: 具体产品角色,它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法,如上图的 ConcreteProductA1 , ConcreteProductA2 , ConcreteProductB1 ,ConcreteProductB2.

1.3 代码

public class Demo {
    public static void main(String[] args) {
        // 定义工厂
        AbstractFactoryA factoryA = new FactoryA();
        // 生产产品
        factoryA.getProductA().commonMethod();
        factoryA.getProductA().uniqueMethod();

        AbstractFactoryB factoryB = new FactoryB();
        factoryB.getProductB().commonMethod();
        factoryB.getProductB().uniqueMethod();
    }
}

// 抽象产品类
abstract class AbstractProduct {

    // 产品共有方法
    public void commonMethod() {
        System.out.println("common method");
    }

    // 产品特有方法
    public abstract void uniqueMethod();
}


// 实现类A
class ProductA extends AbstractProduct {

    @Override
    public void uniqueMethod() {
        System.out.println("product A");
    }
}

// 实现类B
class ProductB extends AbstractProduct {

    @Override
    public void uniqueMethod() {
        System.out.println("product B");
    }
}

// 生产产品A 抽象工厂
abstract class AbstractFactoryA {
    public abstract ProductA getProductA();

}

// 生产产品A 实现类
class FactoryA extends AbstractFactoryA {

    @Override
    public ProductA getProductA() {
        return new ProductA();
    }

}

abstract class AbstractFactoryB {
    public abstract ProductB getProductB();
}

class FactoryB extends AbstractFactoryB {

    @Override
    public ProductB getProductB() {
        return new ProductB();
    }
}

1.4 特点

  • 接口和实现分离,客户端面向接口编程,不用关心具体实现,从具体的产品实现中解耦
  • 增加新的具体工厂和产品族方便,切换产品族方便
  • 不易增加新的产品,如果要增加新的产品需要抽象工厂和所有具体工厂

1.5 应用场景

  • 一个对象族(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式。
  • 在软件产品开发过程中,涉及不容操作的时候,都可以考虑使用抽象工厂模式。
  • 例如一个应用,需要在三个不同平台上运行,可以通过抽象工厂模式屏蔽掉操作系统对应用的影响。
  • 三个不同操作系统上的软件功能、应用逻辑、UI都应该是非常类似的,唯一不同的是调用不同的工厂方法,由不同的产品类去处理操作系统交互的信息。
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!