设计模式之抽象工厂模式

SPPan 2019-04-08 设计模式 100人已围观

抽象工厂模式(Abstract factory pattern)是一种软件开发设计模式。

抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。

工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则。抽象工厂模式就是用来解决这个问题的。

1 介绍

1.1 主要解决的问题

主要解决接口选择的问题。定义一个接口用于创建对象,但是让子类决定初始化哪个类。工厂方法把一个类的初始化下放到子类。

1.2 优点

具体产品从客户代码中被分离出来,容易改变产品的系列,将一个系列的产品族统一到一起创建。

1.3 缺点

在产品族中扩展新的产品是很困难的,它需要修改抽象工厂的接口

1.4 使用场景

1、系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。

2 角色

2.1 AbstructProduct:抽象产品

抽象产品角色是所创建的某一类产品的抽象类。

2.2 ProductXXX:具体产品

具体产品角色是需要创建的某一具体产品的实例。

2.3 AbstructFactory:抽象工厂

抽象工厂角色是所有创建产品族的的工厂的抽象类。

2.4 XXXFactory:具体工厂

具体工厂是用来创建某一族产品的具体工厂。

3 实现

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

3.1 结构图

抽象工厂模式结构图

3.2 代码实现

3.2.1 抽象产品

如下为A和B两类产品。

interface AbstractProductA {
    void attr();
}

interface AbstractProductB {
    void attr();
}

3.2.2 具体产品

A和B两类产品,都实现了产品族1和产品族2所需要的具体产品。

class ProductA1 implements AbstractProductA {

    @Override
    public void attr() {
        System.out.println("ProductA1.attr");
    }
}

class ProductA2 implements AbstractProductA {

    @Override
    public void attr() {
        System.out.println("ProductA2.attr");
    }
}

class ProductB1 implements AbstractProductB {

    @Override
    public void attr() {
        System.out.println("ProductB1.attr");
    }
}

class ProductB2 implements AbstractProductB {

    @Override
    public void attr() {
        System.out.println("ProductB2.attr");
    }
}

3.2.3 抽象工厂

一族产品需要包含A和B两种产品。

interface AbstractFactory {
    AbstractProductA createA();

    AbstractProductB createB();
}

3.2.4 具体工厂

产品族1和产品族2的工厂,按照自己的需要,选择自己产品族的产品来提供使用。

class Factory1 implements AbstractFactory {

    @Override
    public AbstractProductA createA() {
        return new ProductA1();
    }

    @Override
    public AbstractProductB createB() {
        return new ProductB1();
    }
}

class Factory2 implements AbstractFactory {

    @Override
    public AbstractProductA createA() {
        return new ProductA2();
    }

    @Override
    public AbstractProductB createB() {
        return new ProductB2();
    }
}

3.2.5 客户端使用

public class AbstractFactoryMethod {

    public static void main(String[] args) {
        AbstractFactory factory1 = new Factory1();
        factory1.createA().attr();
        factory1.createB().attr();

        Factory2 factory2 = new Factory2();
        factory2.createA().attr();
        factory2.createB().attr();
    }
}

吐槽(0)

文章评论

    共有0条评论

文章目录