设计模式——抽象工厂模式

1,063 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

个人理解: 简单工厂可以这么比作:有一个熟料球工厂,可以生产红色熟料球,黑色熟料球,黄色熟料球
抽象工厂模式可以这么比作:有球工厂,包括塑料球工厂、铁球工厂等等
但是理解上也不能给理解成子集.

更像一种生产母床的工厂

特点

就是将所有的有关联的工厂进行抽象成一个统一的抽象工厂

比如一个塑料球,需要“颜料、塑料”.那么创建一个塑料球工厂就需要一个颜料工厂和一个塑料工厂

任何一个元素的构成都是包含“形状”和“颜色”

实现逻辑

  1. 创建一个AbstractFactory来获取需要的工厂:ShapeFactory和ColorFactory
  2. 创建ShapeFactory和ColorFactory来获取具体的需要的对象

来自菜鸟教程的UML图

实用场景

QQ秀换皮肤,一套一起换也可以一件一件换

实现代码

  1. 创建形状和颜色的接口,来规定所有形状和所有颜色需要遵循的特点
public interface Shape{
    void draw();
}

public interface Color{
    void fill();
}
  1. 创建形状和颜色的实现类,比如圆形、方形;红色、蓝色
public class Rectangle 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 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.");
   }
}
  1. 创建形状和颜色的抽象工厂(工厂有方法可以获取颜色或获取形状)
public abstract class AbstractFactory {
   public abstract Color getColor(String color);
   public abstract Shape getShape(String shape) ;
}
  1. 创建继承了抽象工厂的形状工厂和颜色工厂,并可生产形状和颜色
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;
   }
}

  1. 创建一个工厂创造器
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;
   }
}

使用时:

      //获取形状工厂
      AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");
 
      //获取形状为 Circle 的对象
      Shape shape1 = shapeFactory.getShape("CIRCLE");
 
      //调用 Circle 的 draw 方法
      shape1.draw();
      
      //获取颜色工厂
      AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");
 
      //获取颜色为 Red 的对象
      Color color1 = colorFactory.getColor("RED");
 
      //调用 Red 的 fill 方法
      color1.fill();

个人领悟

从代码逻辑角度说,其实抽象工厂就是将一系列具有关系的工厂抽象出来生成一个抽象工厂类,再提供一个工厂创造器.

从业务逻辑上来说:抽线工厂就是将一系列可能会在一起操作的对象管理起来,这样在逻辑上就可以将其进行一定的串联操作或者进行获取.比如说我要获得

当需要创建的对象是一系列相互关联或相互依赖的产品族时,便可以使用抽象工厂模式。

设计模式只是一种推荐,也就是用了可能对

  1. 后来者的维护
  2. 团队协作
  3. 代码质量 上有更多的帮助,但是区别于一些框架能很直面的增加代码的复用程度和减少代码量.

于学习者来说

  1. 大家都说这么写好,我也学学
  2. 看一些源码的必备良药
  3. 面试上肯定会用上
  4. 从初阶晋级到高阶的必备良药