1. 工厂模式介绍
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
2. 应用场景
1). 日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。
2). 数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
3). 设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口。
3.优缺点
优点: 1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
4. 实现(以形状为例子)
步骤一
创建一个接口 Shape :
/**
* @author caojialun
* @since 2023/4/27 11:02
*/
public interface Shape {
/**
* 绘画
*/
void draw ();
/**
* 路由的key
*/
String routeKey();
}
步骤二
创建接口的实现类 Rectangle:
/**
* @author caojialun
* @since 2023/4/27 11:03
*/
@Component
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("画一个长方形");
}
@Override
public String routeKey() {
return "Rectangle";
}
}
创建接口的实现类 Circle:
/**
* @author caojialun
* @since 2023/4/27 11:04
*/
@Component
public class Circle implements Shape{
@Override
public void draw() {
System.out.println("画一个圆圈");
}
@Override
public String routeKey() {
return "Circle";
}
}
创建接口的实现类 Square :
/**
* @author caojialun
* @since 2023/4/27 11:03
*/
@Component
public class Square implements Shape {
@Override
public void draw() {
System.out.println("画一个正方形");
}
@Override
public String routeKey() {
return "Square";
}
}
步骤三
创建形状工厂,根据key去路由实体
/**
* @author caojialun
* @since 2023/4/27 11:06
*/
@Component
public class ShapeFactory implements ApplicationContextAware {
private ApplicationContext applicationContext;
private Map<String, Shape> routableProcessorMap = new HashMap<>();
@PostConstruct
public void init() {
Map<String, Shape> shapes = applicationContext.getBeansOfType(Shape.class);
routableProcessorMap = shapes.values().stream().collect(Collectors.toMap(Shape::routeKey, Function.identity()));
}
/**
* 通过key路由到对应的实体类
*
* @param code 路由key
* @return shape 具体的实体类
*/
public Shape getShape(String code) {
return routableProcessorMap.get(code);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}
步骤四
使用该工厂测试
@SpringBootTest
class CjlBootApplicationTests {
@Autowired
private ShapeFactory shapeFactory;
@Test
void test(){
Shape square = shapeFactory.getShape("Square");
Shape rectangle = shapeFactory.getShape("Rectangle");
Shape circle = shapeFactory.getShape("Circle");
square.draw();
rectangle.draw();
circle.draw();
}
}
步骤五
测试结果:
画一个正方形
画一个长方形
画一个圆圈