译者:个人翻译,水平有限,如有错误欢迎指出,谢谢!
设计模式-抽象工厂模式
抽象工厂的核心是一个超级工厂,而这个工厂能创建其他的工厂。所以,这个超级工厂也被叫做工厂的工厂。这种类型的设计模式是创建型模式下生成对象的最好的方式之一。
在抽象工厂模式中,一个接口负责创建(抽象)与一个工厂相关的对象,不需要显示的指定它们的类。每一个被生成的工厂能按照工厂模式生产对象。实现
我们将创建Shape
和Color
接口以及实现它们的具体类。接下来我们将会创建一个抽象的工厂类AbstractFactory
。定义工厂类ShapeFactory
和ColorFactory
,并且继承AbstractFactory
类。然后,创建FactoryProducer
工厂生产者类。
AbstractFactoryPatternDemo
,我们的demo
类通过FactoryProducer
来获得一个AbstractFactory
对象。Demo
类通过将图形信息(圆/矩形/正方形)传递到AbstractFactory
来获得它所需要的类型的对象。同时也可以传递颜色信息(红色/绿色/蓝色)到AbstractFactory
来获得demo
类所需要的类型的对象。 第一步
创建一个图形接口
Shape.javapublic interface Shape { void draw();}
第二步
创建实现相同接口的具体类(Shape interface)
Rectangle.javapublic class Rectangle implements Shape { @Override public void draw() { System.out.println("Inside Rectangle::draw() method."); }}
Square.java
public class Square implements Shape { @Override public void draw() { System.out.println("Inside Square::draw() method."); }}
Circle.java
public class Circle implements Shape { @Override public void draw() { System.out.println("Inside Circle::draw() method."); }}
第三步
创建一个颜色接口。
Color.javapublic interface Color { void fill();}
第四步
创建实现相同接口的具体类(Color interface)
Red.javapublic class Red implements Color { @Override public void fill() { System.out.println("Inside Red::fill() method."); }}
Green.java
public class Green implements Color { @Override public void fill() { System.out.println("Inside Green::fill() method."); }}
Blue.java
public class Blue implements Color { @Override public void fill() { System.out.println("Inside Blue::fill() method."); }}
第五步
创建一个抽象类来获取与工厂相对应的Color和Shape对象。
AbstractFactory.javapublic abstract class AbstractFactory { abstract Color getColor(String color); abstract Shape getShape(String shape) ;}
第六步
创建多个继承AbstractFactory的工厂类根据传送的信息生成具体类的对象。
ShapeFactory.javapublic class ShapeFactory extends AbstractFactory { @Override public Shape getShape(String shapeType){ if(shapeType == null){ return null; } if(shapeType.equalsIgnoreCase("CIRCLE")){ return new Circle(); }else if(shapeType.equalsIgnoreCase("RECTANGLE")){ return new Rectangle(); }else if(shapeType.equalsIgnoreCase("SQUARE")){ return new Square(); } return null; } @Override Color getColor(String color) { return null; }}
ColorFactory.java
public class ColorFactory extends AbstractFactory { @Override public Shape getShape(String shapeType){ return null; } @Override Color getColor(String color) { if(color == null){ return null; } if(color.equalsIgnoreCase("RED")){ return new Red(); }else if(color.equalsIgnoreCase("GREEN")){ return new Green(); }else if(color.equalsIgnoreCase("BLUE")){ return new Blue(); } return null; }}
第七步
创建一个工厂生成器通过传递的Shape和Color这样的信息来生成工厂。
FactoryProducer.javapublic class FactoryProducer { public static AbstractFactory getFactory(String choice){ if(choice.equalsIgnoreCase("SHAPE")){ return new ShapeFactory(); }else if(choice.equalsIgnoreCase("COLOR")){ return new ColorFactory(); } return null; }}
第八步
使用FactoryProducer来获得AbstractFactory,使它通过传递类型信息来获得具体类生产工厂。
AbstractFactoryPatternDemo.java
public class AbstractFactoryPatternDemo { public static void main(String[] args) { //获得shape工厂 AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE"); //获得一个circle对象 Shape shape1 = shapeFactory.getShape("CIRCLE"); //调用circle的draw方法 shape1.draw(); //获得一个rectangle对象 Shape shape2 = shapeFactory.getShape("RECTANGLE"); //调用rectangle的draw方法 shape2.draw(); Shape shape3 = shapeFactory.getShape("SQUARE"); shape3.draw(); //获得color factory AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR"); //获得red对象 Color color1 = colorFactory.getColor("RED"); //调用red的fill方法 color1.fill(); Color color2 = colorFactory.getColor("Green"); color2.fill(); Color color3 = colorFactory.getColor("BLUE"); color3.fill(); }}
第九步
校验输出。
Inside Circle::draw() method.Inside Rectangle::draw() method.Inside Square::draw() method.Inside Red::fill() method.Inside Green::fill() method.Inside Blue::fill() method.