美文网首页
创建型之抽象工厂模式

创建型之抽象工厂模式

作者: FisherTige_f2ef | 来源:发表于2020-12-16 20:58 被阅读0次

抽象工厂模式(Abstract Factory Pattern)

可以理解为创建工厂的工厂,即抽象工厂创建工厂方法的实例。

优缺点:具有工厂方法的所有优点及缺点,只是相对于工厂方法,而不再是具体的产品类。

实现步骤:

1、为形状创建一个接口Color

public interface Shape {

 void draw();

}

2、创建实现形状接口的实体类

//画矩形

public class Rectangle implements Shape { 

      @Override  public void draw() { 

             System.out.println("Inside Rectangle::draw() method.");

       }

}

//画圆形

public class Circle implements Shape {

      @Override  public void draw() { 

              System.out.println("Inside Circle::draw() method.");

      }

}

3、为填充颜色创建一个接口 Shape 

public interface Color {

     void fill();

}

4、创建实现填充颜色接口的实体类

//填充红色

public class Red implements Color {

       @Override

      public void fill() {

          System.out.println("Inside Red::fill() method.");

      }

}

//填充绿色

public class Green implements Color {

      @Override

      public void fill() {

          System.out.println("Inside Green::fill() method.");

       }

}

5、为 Color 和 Shape 对象创建抽象类来获取工厂

public abstract class AbstractFactory {

         public abstract Color getColor(String color);

         public abstract Shape getShape(String shape) ;

}

6、创建扩展了 AbstractFactory 的工厂类,基于给定的名称生成实体类的对象

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

      public Color getColor(String color) {

                   return null;

      }

}

public class ColorFactory extends AbstractFactory {

         @Override 

         public Shape getShape(String shapeType){

                  return null;

          } 

      @Override 

       public Color getColor(String color) {

                  if(color == null){ 

                      return null;

                   }       

                  if(color.equalsIgnoreCase("RED")){

                          return new Red();

                  } else if(color.equalsIgnoreCase("GREEN")){ 

                            return new Green();

                  } 

                  return null;

    }    

}

7、创建一个工厂创造器/生成器类,通过传递形状或颜色的类型名称来获取工厂

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;

    }

}

8、使用 FactoryProducer 来获取 AbstractFactory,通过传递类型信息来获取实体类的对象

public class AbstractFactoryPatternDemo {

         public static void main(String[] args) {

              //获取形状工厂

              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();

              //获取颜色工厂

              AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");

              //获取颜色为 Red 的对象

              Color color1 = colorFactory.getColor("RED");

              //调用 Red 的 fill 方法

              color1.fill();

              //获取颜色为 Green 的对象

              Color color2 = colorFactory.getColor("Green");

              //调用 Green 的 fill 方法 

             color2.fill();

       }

}

相关文章

网友评论

      本文标题:创建型之抽象工厂模式

      本文链接:https://www.haomeiwen.com/subject/yckxiktx.html