区别
创建对象不同。简单工厂模式使用fw模式建立对象;工厂方法模式使用Factory模式替代使用new创建对象;抽象工厂模式使用迭代模式创建对象
定义变量不同。简单工厂模式使用参数或者配置文件等事先定义好的变量,然后利用分支判断初始化具体产品类并返回;工厂方法模式不用事先定义变量,使用时随时引用便可;抽象工厂模式都次新增产品,都需要修改类方法
接口数量不同。简单工厂模式只有一个接口;工厂模式有两至三个接口;抽象工厂模式理论上有无限个接口
比较
简单工厂模式不符合“开闭原则”;工厂方法模式完美符合“开闭原则”;抽象工厂模式,在新增产品族的时候符合“开闭原则”,新增产品时不符合,且新增产品族很容易,新增产品很复杂
工厂方法模式把简单工厂模式的内部判断逻辑转移到了客户端代码来进行。新增功能时,简单工厂需要修改工厂类,而工厂方法只需要修改客户端。工厂方法模式克服了简单工厂模式违背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"
}
- 这样通过反射+配置文件+简单工厂模式就解决了数据库访问时的可维护、可扩展问题