抽象工厂模式

故事扮演 提交于 2020-02-08 18:48:15

今天来学习一下抽象工厂模式,在学习之前有两个非常重要的概念,产品等级,产品族。

产品等级就是说,一类产品,比如电视机属于一类产品,不管它是什么牌子的,他都属于电视,再比如冰箱,也属于一个产品等级。

产品族是说由不同产品等级组成的产品家族,比如海尔冰箱,海尔电视等等组成海尔产品族。再比如小米电视,手机,电脑等等组成小米产品族。

抽象工厂模式是要创造出一个产品族。

我们以一个画画的例子来解释其中的具体内容。简单起见,我要画一个红色矩形,绿色圆形。这时我要有两个产品等级,形状和颜色,然后这两个等级组成具体的产品族(抽象工厂)而红色矩形就为具体工厂。

接下来代码实现,先来定义两个产品等级,形状和颜色,分别有一个画和填充的方法

public interface Shape {
    void draw();
}
public interface Color {
    void fill();
}

然后定义具体的产品,也就是具体的形状,颜色

// 矩形
public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("矩形");
    }
}
// 圆形
public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("圆形");
    }
}
// 红色
public class Red implements Color {
    @Override
    public void fill() {
        System.out.println("红色");
    }
}
// 绿色
public class Green implements Color {
    @Override
    public void fill() {
        System.out.println("绿色");
    }
}

一个形状和一个颜色组成了我们的抽象工厂

abstract class AbstractFactory {
    public abstract Shape createShape();

    public abstract Color createColor();
}

现在我需要一个红色矩形,代码如下

public class RedRectangle extends AbstractFactory {
    @Override
    public Shape createShape() {
        return new Rectangle();
    }

    @Override
    public Color createColor() {
        return new Red();
    }
}

再比如我想要一个绿色圆形

public class GreenCircle extends AbstractFactory {
    @Override
    public Shape createShape() {
        return new Circle();
    }

    @Override
    public Color createColor() {
        return new Green();
    }
}

接下来看我们如何画出这两个形状

public class Main {
    public static void main(String[] args) {
        
        // 画红色矩形
        AbstractFactory factory = new RedRectangle();
        factory.createShape().draw();
        factory.createColor().fill();
        
        // 画绿色圆形
        AbstractFactory factory1 = new GreenCircle();
        factory1.createShape().draw();
        factory1.createColor().fill();
    }
}

运行结果如下

矩形
红色
圆形
绿色

我如果想画红色圆形直接新建一个RedCircle类即可,继承AbstractFactory
欢迎评论区交流。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!