设计模式-抽象工厂(Abstract Factory)

553 阅读3分钟

Github 源码地址

23种设计模式总览

创建型模式

结构型模式

行为型模式

定义

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

使用场景

现在用户的需求变多了,除了要求不同的形状之外,我们还要求创建不同颜色的形状,比如圆形,我们要求红色的圆形、赤橙黄绿青蓝紫等各种各样颜色的圆形。按照我们抽象方法模式的设计方案,那么我们就需要实现各种颜色的形状并实现这些颜色的形状对应的工厂类,这样一来我们系统中会增多非常多的工厂类。

实现

步骤 1

创建一个接口:

//形状公共接口
public interface Shape {
    void draw();
}

步骤 2

创建抽象类。

//圆形抽象类Circle
public abstract class Circle implements Shape {
}
//长方形抽象类Rectange
public abstract class Rectangle implements Shape {
}

步骤 3

具体的实现类继承自对应的抽象类,继承自不同的抽象类就相当于将类划分为不同的等级,如:

//具体颜色的Circle实现
public class BlueCircle extends Circle {
    @Override
    public void draw() {
        System.out.println("绘制蓝色的圆");
    }
}
public class RedCircle extends Circle {
    @Override
    public void draw() {
        System.out.println("绘制红色的圆");
    }
}

//具体颜色的Rectange实现
public class RedRectange extends Rectange{
    @Override
    public void draw() {
        System.out.println("绘制红色长方形");
    }
}
public class BlueRectange extends Rectange {
    @Override
    public void draw() {
        System.out.println("绘制蓝色长方形");
    }
}

步骤 4

具体类族的划分我们以颜色为基础,不同类族的对象我们通过对应的具体工厂来创建。所以首先我们需要定义一个抽象工厂,具体工厂(族)实现抽象工厂的方法来生成一组具体对象。

//抽象工厂ShapeFactory 
public interface ShapeFactory {
    Shape getCircle();
    Shape getRectange();
}

//RedShapeFactory(他所代表的是红色形状这一族)
public class RedShapeFactory implements ShapeFactory {
    @Override
    public Shape getCircle() {
        return new RedCircle();
    }

    @Override
    public Shape getRectange() {
        return new RedRectange();
    }
}

//BlueShapeFactory(他所代表的是兰色形状这一族)
public class BlueShapeFactory implements ShapeFactory {
    @Override
    public Shape getCircle() {
        return new BlueCircle();
    }

    @Override
    public Shape getRectange() {
        return new BlueRectange();
    }
}

//...其他族...

步骤 5

public class TestDemo {
    public static void main(String[] args) {
        ShapeFactory redShapeFactory = new RedShapeFactory();
        Shape circle = redShapeFactory.getCircle();
        circle.draw();
        Shape rectangle = redShapeFactory.getRectangle();
        rectangle.draw();

        ShapeFactory blueShapeFactory = new BlueShapeFactory();
        Shape blueCircle = blueShapeFactory.getCircle();
        blueCircle.draw();
    }
}

步骤 6

执行程序,输出结果:

绘制红色的圆
绘制红色长方形
绘制蓝色的圆

从上面的例子我们就可以知道,抽象工厂模式为创建一组对象提供了一种解决方案。 与工厂方法模式相比, 抽象工厂模式中的具体工厂不只是创建一种具体对象, 它负责创建一组(族)具体对象。 代码地址: