工厂方法模式引入工厂等级结构,解决了简单工厂模式中工厂类职责过重的问题,但由于工厂方法模式中每个工厂只创建一类具体类的对象,这将会导致系统当中的工厂类过多,这势必会增加系统的开销。此时,我们可以考虑将一些相关的具体类组成一个“具体类族”,由同一个工厂来统一生产,这就是我们本文要说的“抽象工厂模式”的基本思想。
接着来看我们抽象方法模式一文中我们说的例子,我们现在有这么一个场景;现在用户的需求变多了,除了要求不同的形状之外,我们还要求创建不同颜色的形状,比如圆形,我们要求红色的圆形、赤橙黄绿青蓝紫等各种各样颜色的圆形。按照我们抽象方法模式的设计方案,那么我们就需要实现各种颜色的形状并实现这些颜色的形状对应的工厂类,这样一来我们系统中会增多非常多的工厂类。看起来如下:
//具体类的抽象接口
public interface Shape {
//接口方法
}
//具体类Circle
public class Circle implements Shape {
//接口方法实现
}
//具体类红色圆
public class RedCircle implements Shape {
//接口方法实现
}
//...各种颜色的圆...
//具体类Triangle
public class Triangle implements Shape {
//接口方法实现
}
//具体类红色Triangle
public class RedTriangle implements Shape {
//接口方法实现
}
//...各种颜色的Triangle...
//工厂接口
public interface ShapeFactory {
Shape getShape();
}
//CircleFactory
public class CircleFactory implements ShapeFactory {
//返回实例
}
//RedCircleFactory
public class RedCircleFactory implements ShapeFactory {
//返回实例
}
//...各种颜色的Circle的工厂...
//TriangleFactory
public class TriangleFactory implements ShapeFactory {
//返回实例
}
//RedTriangleFactory
public class RedTriangleFactory implements ShapeFactory {
//返回实例
}
//...各种颜色的Triangle的工厂...
那么我们有没有办法对当前的设计方案进行优化,减少一些工厂类的产生呢?我们下面对当前的系统做进一步抽象。以形状为类的级别、颜色为族来对当前系统作进一步改善。
首先我们要以形状为等级、颜色为族来对系统进行进一步抽象。
等级抽象
进行等级抽象我们需要将不同的形状声明为抽象类(等级划分)并实现公共的抽象接口(Shape),然后具体的实现类继承自对应的抽象类;
//形状公共接口
public interface Shape {
void draw();
}
//圆形抽象类Circle
public abstract class Circle implements Shape {
public abstract void draw();
}
//长方形抽象类Rectange
public abstract class Rectange implements Shape {
public abstract void draw();
}
//其他图形抽象类... ...
具体的实现类继承自对应的抽象类,继承自不同的抽象类就相当于将类划分为不同的等级,如:
//具体颜色的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("绘制蓝色长方形");
}
}
具体类族抽象
具体类族的划分我们以颜色为基础,不同类族的对象我们通过对应的具体工厂来创建。所以首先我们需要定义一个抽象工厂,具体工厂(族)实现抽象工厂的方法来生成一组具体对象。
//抽象工厂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();
}
}
//...其他族...
等级以及族类划分完成之后,我么的客户端在使用时只需要知道抽象工厂(ShapeFactory )以及具体工厂(如BlueShapeFactory )就可以获得指定族的所有形状。
public class TestDemo {
public static void main%