普通工厂模式
我们通过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优雅实现工厂模式