抽象工厂模式,又称“工厂的工厂”,拥有创建其他工厂的工厂。
使用抽象工厂模式时,我们首先使用超级工厂去创建工厂,然后使用被创建工厂去创建对象。
范例
以下代码展示如何使用抽象工厂模式。
我们准备创建各种形状和打印机。对于形状,我们将有圆形,长方形和正方形。对于打印机,我们将有纸张打印机,网页打印机和屏幕打印机。
我们给形状创建Shape接口,如下
interface Shape { void draw(); }
接着我们创建具体类实现Shape接口。
class Rectangle implements Shape { @Override public void draw() { System.out.println("Inside Rectangle::draw() method."); } } class Square implements Shape { @Override public void draw() { System.out.println("Inside Square::draw() method."); } } class Circle implements Shape { @Override public void draw() { System.out.println("Inside Circle::draw() method."); } }
然后我们给打印机创建Printer接口。
interface Printer{ void print(); }
接着我们创建具体类实现Printer接口。
class PaperPrinter implements Printer{ @Override public void print() { System.out.println("paper"); } } class WebPrinter implements Printer{ @Override public void print() { System.out.println("web"); } } class ScreenPrinter implements Printer{ @Override public void print() { System.out.println("screen"); } }
最后我们创建一个抽象类,去获取打印机和形状对象的工厂。
abstract class AbstractFactory { abstract Printer getPrinter(String type); abstract Shape getShape(String shape) ; }
最后我们扩展AbstractFactory而创建工厂类,以便基于给定信息而生成具体类的对象。
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 Printer getPrinter(String type) { return null; } } class PrinterFactory extends AbstractFactory { @Override public Shape getShape(String shapeType){ return null; } @Override Printer getPrinter(String type) { if(type == null){ return null; } if(type.equalsIgnoreCase("paper")){ return new PaperPrinter(); } else if(type.equalsIgnoreCase("web")){ return new WebPrinter(); } else if(type.equalsIgnoreCase("Screen")){ return new ScreenPrinter(); } return null; } }
创建一个工厂生成器或生产者类,以便传递信息比如Shape或Printer而获取工厂。
class FactoryProducer { public static AbstractFactory getFactory(String choice){ if(choice.equalsIgnoreCase("SHAPE")){ return new ShapeFactory(); } else if(choice.equalsIgnoreCase("Printer")){ return new PrinterFactory(); } return null; } }
以下代码展示如何使用抽象工厂模式。
public class Main { public static void main(String[] args) { //get shape factory AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE"); //get an object of Shape Circle Shape shape1 = shapeFactory.getShape("CIRCLE"); //call draw method of Shape Circle shape1.draw(); //get an object of Shape Rectangle Shape shape2 = shapeFactory.getShape("RECTANGLE"); //call draw method of Shape Rectangle shape2.draw(); //get an object of Shape Square Shape shape3 = shapeFactory.getShape("SQUARE"); //call draw method of Shape Square shape3.draw(); //get printer factory AbstractFactory printerFactory = FactoryProducer.getFactory("printer"); Printer printer1 = printerFactory.getPrinter("Paper"); printer1.print(); Printer printer2 = printerFactory.getPrinter("Web"); printer2.print(); Printer printer3 = printerFactory.getPrinter("Screen"); printer3.print(); } }
以上代码生成以下结果。
Inside Circle::draw() method. Inside Rectangle::draw() method. Inside Square::draw() method. paper web screen