设计模式-抽象工厂模式

kart 8年前

抽象工厂的核心是一个超级工厂,而这个工厂能创建其他的工厂。所以,这个超级工厂也被叫做工厂的工厂。这种类型的设计模式是创造类型的模式下生成对象的最好的方式之一。
在抽象工厂模式中,一个接口负责创建(抽象)与一个工厂相关的对象,不需要显示的指定它们的类。每一个被生成的工厂能按照工厂模式生产对象。

实现

我们将创建ShapeColor 接口以及实现它们的具体类。接下来我们将会创建一个抽象的工厂类AbstractFactory。定义的工厂类ShapeFactoryColorFactory,它们都继承AbstractFactory类。然后,创建FactoryProducer工厂生产者类。
AbstractFactoryPatternDemo,我们的demo类通过FactoryProducer来获得一个AbstractFactory 对象。Demo类通过将图形信息(圆/矩形/正方形)传递到AbstractFactory来获得它所需要的类型的对象。同时也可以传递颜色信息(红色/绿色/蓝色)到AbstractFactory来获得demo类所需要的类型的对象。

第一步

创建一个图形接口
Shape.java

  public interface Shape {     void draw();  }  

第二步

创建实现相同接口的具体类(Shape interface)
Rectangle.java

  public 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.java

  public interface Color {     void fill();  }  

第四步

创建实现相同接口的具体类(Color interface)
Red.java

  public 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.java

  public abstract class AbstractFactory {     abstract Color getColor(String color);     abstract Shape getShape(String shape) ;  }  

第六步

创建多个继承AbstractFactory的工厂类根据传送的信息生成具体类的对象。
ShapeFactory.java

  public 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.java

  public 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.