简单工厂模式、工厂方法模式和抽象工厂模式的区别与改进

区别

  1. 创建对象不同。简单工厂模式使用fw模式建立对象;工厂方法模式使用Factory模式替代使用new创建对象;抽象工厂模式使用迭代模式创建对象
  2. 定义变量不同。简单工厂模式使用参数或者配置文件等事先定义好的变量,然后利用分支判断初始化具体产品类并返回;工厂方法模式不用事先定义变量,使用时随时引用便可;抽象工厂模式都次新增产品,都需要修改类方法
  3. 接口数量不同。简单工厂模式只有一个接口;工厂模式有两至三个接口;抽象工厂模式理论上有无限个接口

比较

  • 简单工厂模式不符合“开闭原则”;工厂方法模式完美符合“开闭原则”;抽象工厂模式,在新增产品族的时候符合“开闭原则”,新增产品时不符合,且新增产品族很容易,新增产品很复杂
  • 工厂方法模式把简单工厂模式的内部判断逻辑转移到了客户端代码来进行。新增功能时,简单工厂需要修改工厂类,而工厂方法只需要修改客户端。工厂方法模式克服了简单工厂模式违背OCP(open-close principle)的特点,又保持了封装对象创建过程的优点
  • 抽象工厂模式可以生产一系列的多个产品,而工厂方法模式只能生产一个

抽象工厂改进

简单工厂+抽象工厂

  • 可以将抽象工厂的IFactory接口和具体的ConcreteFactory接口都去掉,取而代之的是一个简单工厂类,例如EasyFactory

在这里插入图片描述

反射+简单工厂

  • 使用反射的话,我们就可以不需要使用switch,因为使用switch的话,添加一个ConcreteProduct,就要添加case条件
public class easyFactory1 {


private static String packName = "DesignPattern.abstractFactory";
private static String sqlName = "mysql";
 
public static IUser createUser() throws Exception{
    String className = packName+"."+sqlName+"User";
    return (IUser)Class.forName(className).newInstance();
}
 
public static ILogin createLogin() throws Exception{
    String className = packName+"."+sqlName+"Login";
    return (ILogin)Class.forName(className).newInstance();
}

}

反射+配置文件+简单工厂

  • 使用反射后,我们更新数据库的时候,还是需要在EasyFactory中修改数据库类型,不符合开闭原则
  • 可以通过配置文件来达到目的,每次通过读取配置文件来获取想要使用的数据库
  • 例如可以用json或xml配置
{
  "packName": "DesignPattern.abstractFactory",
  "DB": "Mysql"
}

  • 这样通过反射+配置文件+简单工厂模式就解决了数据库访问时的可维护、可扩展问题

参考文献

【设计模式】简单工厂、工厂方法与抽象工厂的区别

简单工厂模式、工厂模式以及抽象工厂模式(具体)

工厂模式,简单工厂模式,抽象工厂模式三者有什么区别

《大话设计模式》-程杰

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值