图片和代码来自原文,原文链接:
http://www.tutorialspoint.com/design_pattern/abstract_factory_pattern.htm
-----------------------------------------------------------------------------------------------
抽象工厂模式通过一个超级工厂类来生成其他的工厂类。这个工厂也称为工厂的工厂。抽象工厂模式属于创建型模式,提供了创建对象的最佳实践方法之一。
在抽象工厂模式中,一个接口被用来负责创建和具体对象相关联的工厂。每个生成的工厂可以根据工厂类型创建相应的对象。
实现
我们将创建一个Shape接口,一个Color接口,以及实现这两个接口的具体类;然后创建一个抽象工厂类AbstractFactory。工厂类ShapeFactory和ColorFactory定义为AbstractFactory类的子类;再创建一个工厂生成器FactoryProducer。
示例类AbstractFactoryPatternDemo使用FactoryProducer来获取一个AbstractFactory对象。通过向AbstractFactory对象传递Shape信息(CIRCLE /RECTANGLE / SQUARE)来获取Shape类型的对象,通过向AbstractFactory对象传递Color信息(RED / GREEN / BLUE)来获取Color类型的对象。
步骤1:新建一个接口Shape
Shape.java
publicinterfaceShape{
void draw();
}
步骤2:创建实现Shape接口的类
Rectangle.java
publicclassRectangleimplementsShape{
@Override
publicvoid draw(){
System.out.println("Inside Rectangle::draw() method.");
}
}
Square.java
publicclassSquareimplementsShape{
@Override
publicvoid draw(){
System.out.println("Inside Square::draw() method.");
}
}
Circle.java
publicclassCircleimplementsShape{
@Override
publicvoid draw(){
System.out.println("Inside Circle::draw() method.");
}
}
步骤3:新建一个接口Color
Color.java
publicinterfaceColor{
void fill();
}
步骤4:创建实现Color接口的类
Red.java
publicclassRedimplementsColor{
@Override
publicvoid fill(){
System.out.println("Inside Red::fill() method.");
}
}
Green.java
publicclassGreenimplementsColor{
@Override
publicvoid fill(){
System.out.println("Inside Green::fill() method.");
}
}
Blue.java
publicclassBlueimplementsColor{
@Override
publicvoid fill(){
System.out.println("Inside Blue::fill() method.");
}
}
步骤5:新建一个抽象类获取Shape工厂和Color工厂
AbstractFactory.java
publicabstractclassAbstractFactory{
abstractColor getColor(String color);
abstractShape getShape(String shape);
}
步骤6:创建继承AbstractFactory类的工厂类,根据相应的信息获取具体类的对象。
ShapeFactory.java
publicclassShapeFactoryextendsAbstractFactory{
@Override
publicShape getShape(String shapeType){
if(shapeType ==null){
returnnull;
}
if(shapeType.equalsIgnoreCase("CIRCLE")){
returnnewCircle();
}elseif(shapeType.equalsIgnoreCase("RECTANGLE")){
returnnewRectangle();
}elseif(shapeType.equalsIgnoreCase("SQUARE")){
returnnewSquare();
}
returnnull;
}
@Override
Color getColor(String color){
returnnull;
}
}
ColorFactory.java
publicclassColorFactoryextendsAbstractFactory{
@Override
publicShape getShape(String shapeType){
returnnull;
}
@Override
Color getColor(String color){
if(color ==null){
returnnull;
}
if(color.equalsIgnoreCase("RED")){
returnnewRed();
}elseif(color.equalsIgnoreCase("GREEN")){
returnnewGreen();
}elseif(color.equalsIgnoreCase("BLUE")){
returnnewBlue();
}
returnnull;
}
}
步骤7:创建一个工厂生成类,根据传递的参数(Shape or Color)来获取具体的工厂类。
FactoryProducer.java
publicclassFactoryProducer{
publicstaticAbstractFactory getFactory(String choice){
if(choice.equalsIgnoreCase("SHAPE")){
returnnewShapeFactory();
}elseif(choice.equalsIgnoreCase("COLOR")){
returnnewColorFactory();
}
returnnull;
}
}
步骤8:通过传递具体的类型信息,使用FactoryProducer类获取和具体类相关联的工厂。
AbstractFactoryPatternDemo.java
publicclassAbstractFactoryPatternDemo{
publicstaticvoid 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 color factory
AbstractFactory colorFactory =FactoryProducer.getFactory("COLOR");
//get an object of Color Red
Color color1 = colorFactory.getColor("RED");
//call fill method of Red
color1.fill();
//get an object of Color Green
Color color2 = colorFactory.getColor("Green");
//call fill method of Green
color2.fill();
//get an object of Color Blue
Color color3 = colorFactory.getColor("BLUE");
//call fill method of Color Blue
color3.fill();
}
}
步骤9:输出
Inside Circle::draw() method.
Inside Rectangle::draw() method.
Inside Square::draw() method.
Inside Red::fill() method.
Inside Green::fill() method.
Inside Blue::fill() method.