抽象工厂模式(Abstract Factory)
简介抽象工厂模式又称为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