创建型模式——抽象工厂模式

创建型模式——抽象工厂模式

(一)简述

抽象工厂模式是一个超级工厂,用来创建其他工厂,这个工厂也被称为工厂的工厂。 这种类型的设计模式属于创建模式,因为此模式提供了创建对象的最佳方法之一。在抽象工厂模式中,接口负责创建相关对象的工厂,而不明确指定它们的类。 每个生成的工厂可以按照工厂模式提供对象。

在这里插入图片描述

(二)特点

抽象工厂模式是工厂方法模式的孪生兄弟。工厂方法模式中考虑的是一类产品的生产,如畜牧场只养动物、电视机厂只生产电视机等。我们可以把同种类称为同等级,也就是说:工厂方法模式只考虑生产同等级的产品,但是在现实生活中许多工厂是综合型的工厂,能生产多等级(种类) 的产品,如电器厂既生产电视机又生产洗衣机或空调等。

在这里插入图片描述

因此,为了达到上述效果,出现了抽象工厂模式。抽象工厂模式将考虑多等级产品的生产,将同一个具体工厂所生产的位于不同等级的一组产品称为一个产品族。

我们经常会发现有的网站上有一个按钮,按一下就能变为黑色主题,再按一下就能变为白色主题。其中用的就是抽象工厂模式的思想,将一个产品族定义为黑色的按钮、黑色的文本框、黑色的表格等,另一个产品组定义为白色的按钮、白色的文本框、白色的表格等,然后在这两个产品族之间切换,就能实现切换主题的效果。这个案例把抽象工厂模式体现的淋漓尽致,非常有助于初学者理解。

抽象工厂模式有以下四个角色:

  1. 抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的抽象方法 ,可以创建多个不同等级的产品。
  2. 具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
  3. 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
  4. 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系。

从这个角度我们不难发现,具体工厂中会生产具体的产品,这些产品都属于同一个产品族,所以多个具体工厂也就能生产多个产品族的产品。如果我们需要在多个产品族之间切换时,抽象工厂模式就能给我吗提供方便。

(三)案例

我们可以设想一个案例。我们有一个抽象图形工厂,具体实现是一个黑色图形工厂和一个白色图形工厂,分别可以生产对应颜色的圆形和正方形。我们可以分析出产品族为正方形和圆形,而黑色正方形和白色正方形处于同一个产品等级,同样黑色圆形和白色圆形也处于同一个产品等级。我们下面就来实现这个效果。

首先先写抽象工厂

public interface ShapeFactory {
    
    
    Shape getCircle();
    Shape getSquare();
}

然后写抽象产品

public interface Shape {
    
    
    void draw();
}

生产黑色图形的具体工厂

public class BlackShapeFactory implements ShapeFactory {
    
    
    @Override
    public Shape getCircle() {
    
    
        return new BlackCircle();
    }

    @Override
    public Shape getSquare() {
    
    
        return new BlackSquare();
    }
}

生产白色图形的具体工厂

public class WhiteShapeFactory implements ShapeFactory {
    
    
    @Override
    public Shape getCircle() {
    
    
        return new WhiteCircle();
    }

    @Override
    public Shape getSquare() {
    
    
        return new WhiteSquare();
    }
}

最后是四个具体产品

public class BlackCircle implements Shape {
    
    
    @Override
    public void draw() {
    
    
        System.out.println("BlackCircle");
    }
}
public class BlackSquare implements Shape {
    
    
    @Override
    public void draw() {
    
    
        System.out.println("BlackSquare");
    }
}
public class WhiteCircle implements Shape {
    
    
    @Override
    public void draw() {
    
    
        System.out.println("WhiteCircle");
    }
}
public class WhiteSquare implements Shape {
    
    
    @Override
    public void draw() {
    
    
        System.out.println("WhiteSquare");
    }
}

我们来测试一下:

public class Main {
    
    
    public static void main(String[] args) {
    
    
        ShapeFactory shapeFactory1 = new WhiteShapeFactory();
        shapeFactory1.getCircle().draw();
        shapeFactory1.getSquare().draw();

        ShapeFactory shapeFactory2 = new BlackShapeFactory();
        shapeFactory2.getCircle().draw();
        shapeFactory2.getSquare().draw();
    }
}

通过这个案例应该已经可以理解抽象工厂模式的核心思想,在理解抽象工厂模式的时候应该与前面的方法工厂模式对应来看,这样更容易理解我们为什么需要抽象工厂模式。

2020年7月20日

猜你喜欢

转载自blog.csdn.net/weixin_43907422/article/details/107322030