抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在"抽象工厂"模式中,接口负责创建相关对象的工厂,而无需显式指定其类。每个生成的工厂都可以按照Factory模式提供对象。
无涯教程将创建一个Shape接口和一个实现它的具体类。下一步,创建一个抽象工厂类AbstractFactory。定义了工厂类ShapeFactory,它扩展了AbstractFactory。创建工厂创建者/生成器类FactoryProducer。
AbstractFactoryPatternDemo,无涯教程的演示类使用FactoryProducer来获取AbstractFactory对象。它将对象(CIRCLE/RECTANGLE/SQUARE)传递给AbstractFactory以获得所需的对象类型。
第1步 - 创建Shape形状的接口。
Shape.java
public interface Shape { void draw(); }
第2步 - 创建实现Shape接口的具体类。
RoundedRectangle.java
public class RoundedRectangle implements Shape { @Override public void draw() { System.out.println("Inside RoundedRectangle::draw() method."); } }
RoundedSquare.java
public class RoundedSquare implements Shape { @Override public void draw() { System.out.println("Inside RoundedSquare::draw() method."); } }
Rectangle.java
public class Rectangle implements Shape { @Override public void draw() { System.out.println("Inside Rectangle::draw() method."); } }
第3步 - 创建一个Abstract类以获取Shape对象的工厂。
AbstractFactory.java
public abstract class AbstractFactory { abstract Shape getShape(String shapeType) ; }
第4步 - 创建扩展AbstractFactory的Factory类,以根据给定的信息生成具体类的对象。
ShapeFactory.java
public class ShapeFactory extends AbstractFactory { @Override public Shape getShape(String shapeType){ if(shapeType.equalsIgnoreCase("RECTANGLE")){ return new Rectangle(); }else if(shapeType.equalsIgnoreCase("SQUARE")){ return new Square(); } return null; } }
RoundedShapeFactory.java
public class RoundedShapeFactory extends AbstractFactory { @Override public Shape getShape(String shapeType){ if(shapeType.equalsIgnoreCase("RECTANGLE")){ return new RoundedRectangle(); }else if(shapeType.equalsIgnoreCase("SQUARE")){ return new RoundedSquare(); } return null; } }
第5步 - 创建Factory生通过传递诸如Shape之类的信息来创建工厂
FactoryProducer.java
public class FactoryProducer { public static AbstractFactory getFactory(boolean rounded){ if(rounded){ return new RoundedShapeFactory(); }else{ return new ShapeFactory(); } } }
第6步 - 使用FactoryProducer来获取AbstractFactory,以便通过传递诸如类型之类的信息来获得具体类的工厂。
AbstractFactoryPatternDemo.java
public class AbstractFactoryPatternDemo { public static void main(String[] args) { //获得Shape抽象工厂 AbstractFactory shapeFactory=FactoryProducer.getFactory(false); //获取 Shape Rectangle 的对象 Shape shape1=shapeFactory.getShape("RECTANGLE"); //调用Shape Rectangle的draw方法 shape1.draw(); //得到一个 Shape Square 的对象 Shape shape2=shapeFactory.getShape("SQUARE"); //调用Shape Square的draw方法 shape2.draw(); //获得Shape工厂 AbstractFactory shapeFactory1=FactoryProducer.getFactory(true); //获取 Shape Rectangle 的对象 Shape shape3=shapeFactory1.getShape("RECTANGLE"); //调用Shape Rectangle的draw方法 shape3.draw(); //得到一个 Shape Square 的对象 Shape shape4=shapeFactory1.getShape("SQUARE"); //调用Shape Square的draw方法 shape4.draw(); } }
第7步 - 验证输出。
Inside Rectangle::draw() method. Inside Square::draw() method. Inside RoundedRectangle::draw() method. Inside RoundedSquare::draw() method.
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)