1、简单工厂模式在工厂类中创建对象,每次客户端新增需求时,都要在服务端添加新的操作类,并且要在简单工厂类中的创建对象的方法中添加逻辑判断代码,根据不同的判断创建不同的实例。这样服务端在添加代码的过程中就要修改已有代码,违反了开闭原则。
2、工厂方法模式让子类工厂实现工厂接口,将创建对象的过程推迟到了子类工厂中,这样就可以在客户端执行逻辑判断,调用不同的子类工厂创建不同的对象,当客户端新增需求时,只需在服务端添加新增功能的工厂类即可,无需修改已有代码,解决了简单工厂模式违反了开闭原则的缺点。
package 创建型模式.工厂模式.工厂方法模式;
/**
* @Author: lxpStu
* @Date: 2021/10/25/23:26
* @Description: 创建对象的工厂
*/
public interface BeanFactory<T> {
/**
* 返回创建的对象实例
*
* @return
*/
T createBean();
}
package 创建型模式.工厂模式.工厂方法模式;
/**
* @Author: lxpStu
* @Date: 2021/10/25/23:27
* @Description: 加法工厂实现工厂对象接口
*/
public class AddFactory implements BeanFactory<Add> {
@Override
public Add createBean() {
return new Add();
}
}
package 创建型模式.工厂模式.工厂方法模式;
/**
* @Author: lxpStu
* @Date: 2021/10/25/23:29
* @Description: 减法工厂实现工厂对象接口,客户端添加了减法功能,服务端只需添加一个对象工厂的实现类即可,无需修改其他代码
*/
public class SubFactory implements BeanFactory<Sub> {
@Override
public Sub createBean() {
return new Sub();
}
}
package 创建型模式.工厂模式.工厂方法模式;
/**
* @Author: lxpStu
* @Date: 2021/10/25/23:22
* @Description:
*/
public interface Operation {
/**
* 返回计算结果
*
* @param num1
* @param num2
* @return
*/
double getResult(double num1, double num2);
}
package 创建型模式.工厂模式.工厂方法模式;
/**
* @Author: lxpStu
* @Date: 2021/10/25/23:23
* @Description:
*/
public class Add implements Operation {
@Override
public double getResult(double num1, double num2) {
return num1 + num2;
}
}
package 创建型模式.工厂模式.工厂方法模式;
/**
* @Author: lxpStu
* @Date: 2021/10/25/23:24
* @Description:
*/
public class Sub implements Operation {
@Override
public double getResult(double num1, double num2) {
return num1 - num2;
}
}
package 创建型模式.工厂模式.工厂方法模式;
/**
* @Author: lxpStu
* @Date: 2021/10/25/23:30
* @Description: 测试类,模拟客户端进行逻辑判断
*/
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("输入要执行的是加法还是减法(+/-): ");
String opt = sc.next();
double result = 0.0;
Operation bean = null;
if("+".equals(opt)){
BeanFactory<Add> factory = new AddFactory();
bean = factory.createBean();
}
if("-".equals(opt)){
BeanFactory<Sub> factory = new SubFactory();
bean = factory.createBean();
}
if(bean != null){
result = bean.getResult(1, 2.2);
}
System.out.println(result);
}
}