设计模式二十四章经之抽象工厂模式

时间:2022-06-01
本文章向大家介绍设计模式二十四章经之抽象工厂模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

概述

前面我们已经说到了工厂模式,现在我们扯扯抽象工厂模式。从字母意思理解下,工厂也就是会生产指定的产品。那么抽象工厂就意味着生产出来的产品不是指定的。往简单点说,抽象工厂就是为创建一组相关或者相互依赖的对象提供一个接口,而不需要指明他们的具体类。

使用场景

一个产品族有相同的约束时可以使用抽象工厂模式。是不是听起来很抽象?比如android、ios下都有短信软件和拨号软件,两者同属于软件。但是,他们所在的系统不一样,即使是同一家公司出品的软件,代码实现也是不一样的。这个时候就可以考虑使用抽象工厂模式来产生这些软件。

具体实现

首先,我们创建一个实体类的接口:

public interface Shape {
   void draw();
}

现在我们创建2个实体类去实现这个接口:

public class Square implements Shape {
   @Override
   public void draw() {
      System.out.println("Square:draw() method.");
   }
}
public class Circle implements Shape {
   @Override
   public void draw() {
      System.out.println("Circle:draw() method.");
   }
}

我们在创建一个实体类的接口:

public interface Color{
  void fill();
}

我们继续创建2个实体类去实现这个接口:

public class RedColor implements Color{
  @Override
  public void fill(){
      System.out.println("Color:Red");
  }
}
public class BlueColor implements Color{
  @Override
  public void fill(){
      System.out.println("Color:Blue");
  }
}

现在我们创建一个工厂类:

public abstract class Factory{
  public abstract Shape createShape();
  public abstract Color createColor();
}

接着我们创建2个工厂去实现这个工厂类:

public class RedSquareFactory extends Factory{
  @Override
  public Shape createShape(){
      return new Square();
  }
  @Override
  public Color createColor(){
      return new RedColor();
  }
}
public class BlueCircleFactory extends Factory{
  @Override
  public Shape createShape(){
      return new Circle();
  }
  @Override
  public Color createColor(){
      return new BlueColor();
  }
}

最后我们来写个demo:

public class Demo{
  public static void main(String[] args){
    Factory redSquareFactory=new RedSquareFactory();
    redSquareFactory.createShape().draw();
    redSquareFactory.createColor().fill();
    Factory blueCircleFactory=new BlueCircleFactory();
    blueCircleFactory.createShape().draw();
    blueCircleFactory.createColor().fill();
  }
}

输出结果如下:

Square:draw() method.
Color:Red
Circle:draw() method.
Color:Blue

总结

优点:

  • 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

缺点:

  • 产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。