模式思想
- 约定不同实体类的行为接口
- 定义实现接口的实体类
- 定义抽象工厂类用于获取具体工厂生产类
- 定义继承自抽象工厂类的具体工厂类
- 定义一个工厂创造器/生成器类用来获取具体工厂
- 调用创造器/生成器类用于生产
代码实现
- 约定接口
- Color.java
package abstractfactory;
public interface Color {
void fill();
}
- Shape.java
package abstractfactory;
public interface Shape {
void draw();
}
- 定义实体类
- ColorGreen.java
package abstractfactory;
public class ColorGreen implements Color {
public void fill() {
System.out.println("Inside ColorGreen::fill() method.");
}
}
- ColorBlue.java
package abstractfactory;
public class ColorBlue implements Color {
public void fill() {
System.out.println("Inside ColorBlue::fill() method.");
}
}
- ShapeCircle.java
package abstractfactory;
public class ShapeCircle implements Shape {
public void draw() {
System.out.println("Inside ShapeCircle::draw() method.");
}
}
- ShapeRectangle.java
package abstractfactory;
public class ShapeRectangle implements Shape {
public void draw() {
System.out.println("Inside ShapeRectangle::draw() method.");
}
}
- 定义抽象工厂类
package abstractfactory;
public abstract class AbstractFactory {
public abstract Shape getShape(String shape);
public abstract Color getColor(String color);
}
- 定义具体工厂类
- FactoryColor.java
package abstractfactory;
public class FactoryColor extends AbstractFactory {
public Color getColor(String colorType) {
if (colorType == null) {
return null;
}
if (colorType.equalsIgnoreCase("BLUE")) {
return new ColorBlue();
} else if (colorType.equalsIgnoreCase("GREEN")) {
return new ColorGreen();
}
return null;
}
public Shape getShape(String shapeType) {
return null;
}
}
- FactoryShape.java
package abstractfactory;
public class FactoryShape extends AbstractFactory {
public Shape getShape(String shapeType) {
if (shapeType == null) {
return null;
}
if (shapeType.equalsIgnoreCase("CIRCLE")) {
return new ShapeCircle();
} else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
return new ShapeRectangle();
}
return null;
}
public Color getColor(String colorType) {
return null;
}
}
- 定义创造器/生成器类
package abstractfactory;
public class FactoryProducer {
public static AbstractFactory getFactory(String choice) {
if (choice.equalsIgnoreCase("COLOR")) {
return new FactoryColor();
} else if (choice.equalsIgnoreCase("SHAPE")) {
return new FactoryShape();
}
return null;
}
}
- 调用创造器/生成器类用于生产
import abstractfactory.AbstractFactory;
import abstractfactory.Color;
import abstractfactory.FactoryProducer;
import abstractfactory.Shape;
public class AbstractFactoryDemo {
public static void main(String[] args) {
AbstractFactory factoryShape = FactoryProducer.getFactory("shape");
if (factoryShape != null) {
Shape shape = factoryShape.getShape("Circle");
shape.draw();
} else {
System.out.println("unknown factory type.");
}
AbstractFactory factoryColor = FactoryProducer.getFactory("color");
if (factoryColor != null) {
Color color = factoryColor.getColor("blue");
color.fill();
} else {
System.out.println("unknown factory type.");
}
}
}
指导文档
http://www.runoob.com/design-pattern/abstract-factory-pattern.html