小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
创建型模式
对类的实例化过程进行抽象.将对象的创建和使用分离开来
外界对于这些对象只需要知道它们共同的接口,而不清楚其具体的实现细节,使整个系统的设计更加符合单一职责原则。
简单工厂模式
概述
页面上很多按钮,有圆的,有方的.但是所有按钮都可以点击,所以所有按钮都遵循一个基类(可点击的,有形状的),然后实现其各自子类的行为(方的或者圆的)
存在目的
使对象的创建在业务实现的时候决定创建哪个具体对象
逻辑实现
需要三部分
- 工厂角色(Factory):业务来决定我需要生产出来哪个角色
- 抽象产品角色(Product):按钮,以及按钮的方法
- 具体产品角色(ConcreteProduct):圆形按钮,方型按钮
代码实现
- 定义一个基类的统一接口
- 创建多个具体实现的产品接口
- 创建一个根据逻辑来实例化需要对象的工厂
- 使用该工厂
定义一个接口
public interface Button{
void myShape();
}
创建多个具体实现的产品接口
public class CircleButton implements Button{
@Override
public void myShape(){
System.out.print("我是圆的按钮;")
}
}
public class SquareButton implements Button{
@Overrid
public void myShape(){
System.out.print("我是方的按钮;")
}
}
创建一个根据逻辑来实例化需要对象的工厂
public class Fastory{
public Button getButton(String shape){
if(shape=="圆的"){
return new CircleButton();
}
if(shape=="方的"){
return new SquareButton();
}
}
}
使用该工厂
public class useButton{
public static void main(String[] args){
String shape="用户输入的形状";
Factory factory=new Factory();
Button circleButton=factory.getButton("圆的");
circleButton.myShape();
//输出“我是方的按钮”
}
}
使用场景
- jdbc数据库连接池
即开发者并不知道会用这个jar去链接什么数据库,但是,所有配置文件中有一个spring.datasource.hikari.type
参数供开发者指定链接的是什么数据库.在项目初始化的时候就会去创建具体数据库的实例化对象来实现功能
- Java中binlog监听的处理器进行缓存更新
监听的消息可能是insert
,update
,delete
.只有判断出是什么样的binlog,才会生成对应的处理器对象供后续逻辑使用
优缺点
优点:
- 可以直接使用配置文件来更改代码的接口走向
- 开发者只关注与这个方法的参数,而不需要关注于这个方法具体实现的产品类
缺点:
- 工厂类集中式的管理实现方法,容易出现一点错误全盘崩溃
- 实现上较为复杂,多了很多冗余的类
适用场景
- 工厂类负责创建的对象比较少,由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。(增删改查)
- 客户端只知道传入工厂类的参数,对于如何创建对象并不关心。(mysql、oracle)