Abstract Factory模式是另一种创建模式。

抽象工厂模式,也被称为工厂的厂,有它创建其他工厂一个工厂。

当使用抽象工厂模式,我们先用超级工厂创建工厂,然后使用创建的工厂创建对象。

下面的代码演示了如何使用抽象工厂模式。

我们要创建的形状和打印机。对于形状,我们将有圆形,长方形和正方形。对于打印机,我们将有纸打印机,网络打印机和丝网印刷机。

对于形状,我们将创建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.\");
   }
}

之后,我们创建一个打印机接口。

interface Printer{
   void print();
}

然后,我们创建具体的类实现打印机接口。

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;
 }
}

创建一个厂发电机/生产类传递一个信息,如形状或打印机拿到工厂

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   of Shape Circle
      Shape shape1 = shapeFactory.getShape(\"CIRCLE\");

      //call draw method of Shape Circle
      shape1.draw();

      //get an   of Shape Rectangle
      Shape shape2 = shapeFactory.getShape(\"RECTANGLE\");

      //call draw method of Shape Rectangle
      shape2.draw();
      
      //get an   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();
   }
}

 

收藏 打印