设计模式——使用spring自动注入实现工厂模式

普通工厂模式

设计模式 | 菜鸟教程 (runoob.com)

我们通过spring注入的方式来改造上面的例子

简单工厂模式
定义接口

public interface Shape {
   void draw();
}

两个实现类,注意此时我们需要注入到spring容器当中,加入@Service注解,其他几个声明bean的注解也行

@Service("Circle")
public class Circle implements Shape {

   @Override
   public void draw() {
      System.out.println("圆形");
   }
}

@Service("Square")
public class Square implements Shape {

   @Override
   public void draw() {
      System.out.println("正方形");
   }
}

定义工厂,记得加@Component注解

@Component("ShapeFactory")
public class ShapeFactory {

   //这一步是关键,spring会自动把Shape接口的实现类注入到容器当中
   @Autowired
   private Map<String,Shape> shapeMap;
   //使用 getShape 方法获取形状类型的对象
   public Shape getShape(String shapeType){
      return shapeMap.get(shapeType);
   }
}

测试类

    //注入工厂
    @Autowired
    ShapeFactory shapeFactory;
    @Test
    void simpleFactory() {
        shapeFactory.getShape("Circle").draw();
        shapeFactory.getShape("Square").draw();
    }

同理,我们可以实现抽象工厂模式
抽象工厂模式
顶级抽象父类与两个接口

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



public interface Color {
   void fill();
}




public interface Shape {
   void draw();
}	

颜色与形状工厂与产生他们两个工厂的工厂

@Component("FactoryProducer")
public class FactoryProducer {

   @Autowired
   private Map<String,AbstractFactory> abstractFactoryMap;
   public AbstractFactory getAbstractFactory(String type){
      return abstractFactoryMap.get(type);
   }
}



@Component("ColorFactory2")
public class ColorFactory2 extends AbstractFactory {


   @Autowired
   private Map<String,Color> colorMap;

   @Override
   public Color getColor(String color) {
      return colorMap.get(color);
   }

   @Override
   public Shape getShape(String shapeType){
      return null;
   }


}



@Service("ShapeFactory2")
public class ShapeFactory2 extends AbstractFactory {

   //这一步是关键
   @Autowired
   private Map<String,Shape> shapeMap;
   //使用 getShape 方法获取形状类型的对象
   @Override
   public Shape getShape(String shapeType){
      return shapeMap.get(shapeType);
   }

   @Override
   public Color getColor(String color) {
      return null;
   }
}

四个实现类

@Service("Circle")
public class Circle implements Shape {

   @Override
   public void draw() {
      System.out.println("圆形");
   }
}




@Service("Square")
public class Square implements Shape {

   @Override
   public void draw() {
      System.out.println("正方形");
   }
}



@Service("Blue")
public class Blue implements Color {

   @Override
   public void fill() {
      System.out.println("蓝色");
   }
}



@Service("Red")
public class Red implements Color {
   @Override
   public void fill() {
      System.out.println("红色");
   }
}

测试类

    @Autowired
    FactoryProducer factoryProducer;
    @Test
    void abstractFactory() {
        factoryProducer.getAbstractFactory("ColorFactory2").getColor("Red").fill();
        factoryProducer.getAbstractFactory("ColorFactory2").getColor("Blue").fill();
        factoryProducer.getAbstractFactory("ShapeFactory2").getShape("Circle").draw();
        factoryProducer.getAbstractFactory("ShapeFactory2").getShape("Square").draw();
    }

相关链接

如何使用 Spring 实现策略模式+工厂模式 - 简书 (jianshu.com)
springboot优雅实现工厂模式

你可能感兴趣的:(设计模式,spring,设计模式,java)