设计模式-抽象工厂模式

199 阅读4分钟

文章结构:意义是什么,解决了什么,实例,举例,图解+说明

意义:

提供一个创建一系列,相关或相互依赖的对象的接口,而无需指定他们具体的类。

解决:

解决了接口选择的问题

优点:

当整个产品中的多个对象被设计在一起工作时,他能保证客户端始终只使用同一个产品中的对象,就像是USB接口可以链接鼠标键盘,那你使用的鼠标键盘都是属于usb接口的,而DP和HDMI 链接显示器,也就是说当你使用显示器时,不会去链接USB接口

缺点:

当你增加一个USB接口的使用者时,你需要在抽象工厂里面添加一个对象,并且需要在创建一个接口,一系列对象,和在FactoryProduct工厂选择里面,增加一个返回值,相对来说比较麻烦

实例

步骤一:创建一个接口,并定义一个图形接口,当作基础接口

public interface Shape {
    void draw(); 
}

步骤二: 创建三个 图形的实体类,并实现图形接口

长方形类
public class Rectange implements Shape {
    @Override 
    public void draw() { 
        System.out.println("Inside Rectangle::draw() method."); 
    }
}
正方形类
public class Square implements Shape {
    @Override 
    public void draw() { 
        System.out.println("Inside Square::draw() method."); 
    } 
}
圆形类
public class Circle implements Shape {
    @Override 
    public void draw() { 
        System.out.println("Inside Circle::draw() method."); 
    } 
}

步骤三: 创建一个颜色接口,按照工厂模式创建就可以

public interface Color {
    void fill(); 
}

步骤四: 创建颜色接口的具体实现类

颜色-红色
public class Red implements Color {
    @Override 
    public void fill() { 
        System.out.println("Inside Red::fill() method."); 
    } 
}
颜色-绿色
public class Blue implements Color {
    @Override 
    public void fill() { 
        System.out.println("Inside Blue::fill() method."); 
    } 
}
颜色-绿色
public class Green implements Color {
    @Override 
    public void fill() { 
        System.out.println("Inside Green::fill() method."); 
    } 
}

步骤五:为颜色和形状创建抽象工厂

这一步也是,抽象工厂和工厂设计模式做出区分的一个步骤,为color和shape对象创建抽象类来获取工厂。

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

步骤六:创建颜色和形状的工厂类

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();
      } else if(color.equalsIgnoreCase("BLUE")){
         return new Blue();
      }
      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();
      
      //获取形状为 Square 的对象
      Shape shape3 = shapeFactory.getShape("SQUARE");
 
      //调用 Square 的 draw 方法
      shape3.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();
 
      //获取颜色为 Blue 的对象
      Color color3 = colorFactory.getColor("BLUE");
 
      //调用 Blue 的 fill 方法
      color3.fill();
   }
}

图解和说明(图解-对应上面的例子,说明对应我自己举得例子)

整个抽象工厂设计模式的说明

1:我们按照抽象工厂的模式,创建两个接口A,B,和他们两个接口分别的实例,然后我们在创建一个抽象工厂类C,内部添加两个抽象方法返回值分别是A,B
2:我们再来创建A,B的抽象AF,BF整个抽象类
3:此时创建一个工厂产出类,D 用于获取对应的工厂
4:调用工厂产出类,获取图形/颜色的工厂(AF,BF) ,此时我们已经获取了对应的工厂,那么就可以利用工厂里面的方法获取对象实例,如获取了AF 那么AF.getShape("传入图形的类型")就获取了某个图形的实例。

图解

image.png