抽象工厂模式
内容参考 W3c School
类型:创建型设计模式
解决场景:一个问题中解决多个方面事情。购买一辆车,包含配套的保险,选择车辆颜色等。
目录
UML类图
用户通过在工厂的前台进行套餐定制,选择产品的形状以及配套的颜色。然后分别由形状工厂去绘制形状,颜色工厂来填充对应颜色。
一 创建 Color 和 Shape接口
public interface Color {
/**
* 填充颜色
*/
public abstract void fill();
}
public interface Shape {
/**
* 绘制图形
*/
public abstract void draw();
}
二 创建实体类
ShapeType
public class ShapeType {
public static final String CIRCLE = "circle";
public static final String RECTANGLE = "rectangle";
public static final String SQUARE = "square";
}
ColorType
public class ColorType {
public static final String RED = "red";
public static final String BLUE = "blue";
public static final String GREEN = "green";
}
Circle
public class Circle implements Shape {
/**
* 绘制圆形
*/
@Override
public void draw() {
System.out.println("[Circle] Draw");
}
}
Square
public class Square implements Shape {
/**
* 绘制矩形
*/
@Override
public void draw() {
System.out.println("[Square] Draw");
}
}
Rectangle
public class Rectangle implements Shape {
/**
* 绘制三角形
*/
@Override
public void draw() {
System.out.println("[Rectangle] Draw");
}
}
Red
public class Red implements Color{
/**
* 填充红色
*/
@Override
public void fill() {
System.out.println("[Red] fill");
}
}
Blue
public class Blue implements Color{
/**
* 填充蓝色
*/
@Override
public void fill() {
System.out.println("[Blue] fill");
}
}
Green
public class Green implements Color{
/**
* 填充绿色
*/
@Override
public void fill() {
System.out.println("[Green] fill");
}
}
三 创建抽象工厂
public abstract class AbstractFactory {
/**
* 获取填充的颜色
* @param color 颜色名称
* @return 颜色对象
*/
abstract Color getColor(String color);
/**
* 获取绘制的图形
* @param shapeType 图形名称
* @return 图形对象
*/
abstract Shape getShape(String shapeType);
}
四 创建工厂
ColorFactory
public class ColorFactory extends AbstractFactory{
@Override
Color getColor(String color) {
if ("".equalsIgnoreCase(color) || null == color){
return null;
}
if (RED.equalsIgnoreCase(color)){
return new Red();
}else if (BLUE.equalsIgnoreCase(color)){
return new Blue();
}else if (GREEN.equalsIgnoreCase(color)){
return new Green();
}
return null;
}
@Override
Shape getShape(String shapeType) {
return null;
}
}
ShapeFactory
public class ShapeFactory extends AbstractFactory{
@Override
Color getColor(String color) {
return null;
}
@Override
Shape getShape(String shapeType) {
if ("".equalsIgnoreCase(shapeType) || null == shapeType){
return null;
}
if (CIRCLE.equalsIgnoreCase(shapeType)){
return new Circle();
}else if (SQUARE.equalsIgnoreCase(shapeType)){
return new Square();
}else if (RECTANGLE.equalsIgnoreCase(shapeType)){
return new Rectangle();
}
return null;
}
}
五 工厂创建者
public class FactoryProducer {
public static String color = "color";
public static String shape = "shape";
public static AbstractFactory getFactory(String choice){
if (shape.equalsIgnoreCase(choice)){
return new ShapeFactory();
}else if (color.equalsIgnoreCase(choice)){
return new ColorFactory();
}
return null;
}
}
六 Main
public class ExecuteMain {
public static void main(String[] args) {
AbstractFactory shapeFactory = FactoryProducer.getFactory("shape");
AbstractFactory colorFactory = FactoryProducer.getFactory("color");
Shape circle = shapeFactory.getShape("circle");
Shape rectangle = shapeFactory.getShape("rectangle");
Shape square = shapeFactory.getShape("square");
circle.draw();
rectangle.draw();
square.draw();
Color red = colorFactory.getColor("red");
Color blue = colorFactory.getColor("blue");
Color green = colorFactory.getColor("green");
red.fill();
blue.fill();
green.fill();
}
}
七 运行
[Circle] Draw
[Rectangle] Draw
[Square] Draw
[Red] fill
[Blue] fill
[Green] fill
Process finished with exit code 0