概念:抽象工厂模式是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂
优劣;
- 优点:低耦合,扩展性高
- 缺点:每增加一个产品或产品族或者一个新的工厂,都需要改动若干个类,改动量大
类示意图:
示例:
定义图形接口
package test.Factory2;
/**
* 图形接口
* @author sunlh
*
*/
public interface Shape {
void draw();
}
定义图形实现类
package test.Factory2;
public class SquareShape implements Shape {
@Override
public void draw() {
System.out.println("创建一个方形图形对象");
}
}
package test.Factory2;
public class CircleShape implements Shape{
@Override
public void draw() {
System.out.println("创建一个圆形图形对象");
}
}
定义颜色接口
package test.Factory2;
/**
* 颜色接口
* @author sunlh
*
*/
public interface Color {
void fill();
}
定义颜色实现类
package test.Factory2;
public class BlueColor implements Color {
@Override
public void fill() {
System.out.println("填充蓝色");
}
}
package test.Factory2;
public class RedColor implements Color {
@Override
public void fill() {
System.out.println("填充红色");
}
}
定义抽象工厂
package test.Factory2;
/**
* 抽象工厂
* 超级工厂,图形工厂和颜色工厂的工厂
* @author sunlh
*
*/
public abstract class AbstractFactory {
public abstract Color getColor(String color);
public abstract Shape getShape(String shapeType);
}
定义图形工厂和颜色工厂,继承抽象工厂,并实现其对应的工厂创建方法
package test.Factory2;
/**
* 图形工厂
* 定义一个创建图形方法
* @author sunlh
*
*/
public class ShapeFactory extends AbstractFactory{
@Override
public Shape getShape(String shapeType) {
if (shapeType == null) {
return null;
}
if (shapeType.equalsIgnoreCase("circle")) {
return new CircleShape();
} else if (shapeType.equalsIgnoreCase("square")) {
return new SquareShape();
}
return null;
}
@Override
public Color getColor(String color) {
return null;
}
}
package test.Factory2;
/**
* 颜色工厂
* 定义一个颜色对象方法
* @author sunlh
*
*/
public class ColorFactory extends AbstractFactory{
@Override
public Shape getShape(String shapeType) {
return null;
}
@Override
public Color getColor(String color) {
if (color == null) {
return null;
}
if (color.equalsIgnoreCase("red")) {
return new RedColor();
} else if (color.equalsIgnoreCase("blue")) {
return new BlueColor();
}
return null;
}
}
定义工厂创造器,根据参数创建不同工厂
package test.Factory2;
/**
* 工厂创造器类,通过参数获取工厂
* @author sunlh
*
*/
public class FactoryProducter {
public static AbstractFactory getFactory(String choice) {
if (choice.equalsIgnoreCase("shape")) {
return new ShapeFactory();
} else if (choice.equalsIgnoreCase("color")) {
return new ColorFactory();
}
return null;
}
}
测试
package test.Factory2;
/**
* 测试
* @author sunlh
*
*/
public class Test {
public static void main(String[] args) {
// 创建图形抽象工厂
AbstractFactory shapeFactory = FactoryProducter.getFactory("shape");
// 创建圆形图形
Shape circle = shapeFactory.getShape("circle");
circle.draw();
// 创建方形图形
Shape square = shapeFactory.getShape("square");
square.draw();
// 创建颜色抽象工厂
AbstractFactory colorFactory = FactoryProducter.getFactory("color");
// 创建红色颜色对象
Color red = colorFactory.getColor("red");
// 填充红色
red.fill();
// 创建蓝色颜色对象
Color blue = colorFactory.getColor("blue");
// 填充红色
blue.fill();
}
}
测试结果
创建一个圆形图形对象
创建一个方形图形对象
填充红色
填充蓝色