工厂方法模式概述
有一个抽象类(接口),负责抽象出某个产品线(类),每多出一个产品,则继承该产品线(类或实现接口),创建一个新的类,由此每次多出一个产品的时候,无需操作原有类的内容,只需要新建一个类继承原产品线(实现接口)即可。
以下我们仍然以一个简单的计算器作为例子
定义每个运算逻辑
//运算方法接口
public interface Operator {
public int getResult(int number1, int number2);
}
//各个运算方法类
//加法
public class Addition implements Operator{
public int getResult(int number1, int number2) {
return number1 + number2;
}
}
//减法
public class Subtraction implements Operator{
public int getResult(int number1, int number2) {
return number1 - number2;
}
}
//乘法
public class Multiplication implements Operator {
public int getResult(int number1, int number2) {
return number1 * number2;
}
}
//除法
public class Divition implements Operator {
public int getResult(int number1, int number2) {
return number1 / number2;
}
}
工厂类
//负责操作的工厂接口 也视为一个 产品线
public interface IFactory {
public Operator CreateOperation();
}
//加法工厂
public class AddFactory implements IFactory {
public Operator CreateOperation() {
return new Addition();
}
}
//减法工厂
public class SubFactory implements IFactory {
public Operator CreateOperation() {
return new Subtraction();
}
}
//乘法工厂
public class MultiFactory implements IFactory {
public Operator CreateOperation() {
return new Multiplication();
}
}
//除法工厂
public class DivitFactory implements IFactory {
public Operator CreateOperation() {
return new Divition();
}
}
//测试函数
public class TestMain {
public static void main(String[] args) {
//由当前调用的客户端来决定实例化哪个工厂的运算类
IFactory methodfactory = new MultiFactory();
Operator operator = methodfactory.CreateOperation();
System.out.println(operator.getResult(2, 3));
}
}
总结
与简单工厂模式对比:
简单工厂模式的优点是将必要的判断交由工厂类进行,客户端避免了对具体产品的依赖;缺点是每次新增一个新的产品时需要改工厂类的源码,违背了开闭原则;
工厂方法模式实现时,需要由客户端通过实例化指定工厂来决定实现指定运算类,工厂方法把简单工厂的内部逻辑判断移到了客户端进行,当有新产品出现时也只需要继承父类(接口)编写新类即可。
才疏学浅,如文中有错误,感谢大家指出。