抽象工厂模式(Abstract Factory)

xiaohai 2021-12-30 15:14:36 1422人围观 标签: 设计模式 
简介抽象工厂模式又称为Kit模式,属于对象创建型模式,是工厂方法模式的升级版,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。

模式定义

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

抽象工厂模式又称为Kit模式,属于对象创建型模式,是工厂方法模式的升级版,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。

抽象工厂模式需要满足的条件:

  • 系统中有多于一个的族
  • 而每次只使用其中某一族

模式优缺点

  • 优点
    • 抽象工厂模式隔离了具体类的生成, 使得客户并不需要知道什么被创建。 由于这种隔离,更换一个具体工厂就变得相对容易, 所有的具体工厂都实现了抽象工厂中定义的那些公共接口, 因此只需改变具体工厂的实例, 就可以在某种程度上改变整个软件系统的行为;
    • 当一个族中的多个对象被设计成一起工作时, 它能够保证客户端始终只使用同一个族中的对象;
    • 增加新的族很方便, 无须修改已有系统, 符合“开闭原则”;
  • 缺点
    • 增加新的等级结构麻烦, 需要对原有系统进行较大的修改, 甚至需要修改抽象层代码,这显然会带来较大的不便, 违背了“开闭原则”;

适用场景

  • 一个系统不应当依赖于具体类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是很重要的,用户无须关心对象的创建过程,将对象的创建和使用解耦;
  • 系统中有多于一个的族,而每次只使用其中某一族。可以通过配置文件等方式来使得用户可以动态改变族,也可以很方便地增加新的族;
  • 属于同一个族的对象将在一起使用,这一约束必须在系统的设计中体现出来。同一个族中的对象可以是没有任何关系的对象,但是它们都具有一些共同的约束,如同一操作系统下的按钮和文本框,按钮与文本框之间没有直接关系,但它们都是属于某一操作系统的,此时具有一个共同的约束条件:操作系统的类型;
  • 等级结构稳定,设计完成之后,不会向系统中增加新的等级结构或者删除已有的等级结构;

模式结构

  • 抽象工厂(Abstract Factory):声明一组用于创建一族产品的方法,每个方法对应一种对象;在抽象工厂中声明了多个工厂方法, 用于创建不同类型的对象, 抽象工厂可以是接口, 也可以是抽象类或者具体类;
  • 具体工厂(Concrete Factory):具体工厂实现了抽象工厂,每个工厂方法返回一个具体对象,一个具体工厂所创建的具体对象构成一个族;
  • 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品;
  • 具体产品(Concrete Product):实现了抽象产品角色所定义的接口,由具体工厂来创建,它 同具体工厂之间是多对一的关系;

模式实现

package com.company.abstractFactoryPattern;

public class AbstractFactoryPattern {
    public static void main(String[] args) {
        AbstractFactory factoryA = new FactoryA();
        factoryA.produceEngine();
        factoryA.produceAirCondition();

        AbstractFactory factoryB = new FactoryB();
        factoryB.produceEngine();
        factoryB.produceAirCondition();
    }
}

////////////////////////定义一系列产品//////////////////////////////
//引擎接口
interface Engine {
    public void produce();
}

//引擎A
class EngineA implements Engine {
    @Override
    public void produce() {
        System.out.println("生产引擎A");
    }
}

//引擎B
class EngineB implements Engine {

    @Override
    public void produce() {
        System.out.println("生产引擎B");
    }
}

//空调接口
interface AirCondition {
    public void produce();
}

//空调A
class AirConditionA implements AirCondition {

    @Override
    public void produce() {
        System.out.println("生产空调A");
    }
}

//空调B
class AirConditionB implements AirCondition {

    @Override
    public void produce() {
        System.out.println("生产空调B");
    }
}


/////////////////////////工厂///////////////////////////
//定义工厂接口
interface AbstractFactory {
    public void produceEngine();//生产引擎

    public void produceAirCondition();//生产发动机
}

//生产工厂A
class FactoryA implements AbstractFactory {

    @Override
    public void produceEngine() {
        (new EngineA()).produce();
    }

    @Override
    public void produceAirCondition() {
        (new AirConditionA()).produce();
    }
}

//工厂B
class FactoryB implements AbstractFactory {

    @Override
    public void produceEngine() {
        (new EngineB()).produce();
    }

    @Override
    public void produceAirCondition() {
        (new AirConditionB()).produce();
    }
}

运行结果:

生产引擎A
生产空调A
生产引擎B
生产空调B