工厂方法模式
程序员文章站
2022-03-09 18:20:08
...
基本定义
定义一个创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
简单工厂VS工厂方法
简单工厂模式最大的优点在于工厂类中包含必要的逻辑判定,根据客户端的选择动态实例化相关的类,相对于客户端来讲,去除了与具体类产品的依赖。
工厂方法模式的实现,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的。也就也是说工厂方法模式把简单工厂的内部逻辑判断搬移到客户端代码来进行。你要加的功能,本来就是改变工厂类,而现在是修改客户端!
UML图
代码
IFactory
package com.bjsxt.actory;
interface IFactory {
public abstract Operation createOperation();
}
AddFactory
package com.bjsxt.actory;
public class AddFactory implements IFactory{
public Operation createOperation() {
return new OperationAdd();
}
}
MulFactory
package com.bjsxt.actory;
public class MulFactory implements IFactory {
public Operation createOperation() {
return new OperationMul();
}
}
Operation
package com.bjsxt.actory;
abstract class Operation {
protected double numberA;
protected double numberB;
public Operation(double numberA, double numberB) {
this.numberA = numberA;
this.numberB = numberB;
}
public Operation() {
}
public void setNumberA(double numberA) {
this.numberA = numberA;
}
public void setNumberB(double numberB) {
this.numberB = numberB;
}
public abstract double operation();
}
package com.bjsxt.actory;
public class OperationAdd extends Operation {
public double operation() {
double result = numberA + numberB;
return result;
}
}
OperationMul
package com.bjsxt.actory;
public class OperationMul extends Operation {
public double operation() {
double result = numberA + numberB;
return result;
}
}
Agent
package com.bjsxt.actory;
public class Agent {
public static void main(String[] args) {
IFactory operFactory = new AddFactory();
Operation operation = operFactory.createOperation();
operation.numberA = 1;
operation.numberB = 2;
double reseult = operation.operation();
System.out.println(reseult);
}
}
使用场景
1、一个类不知道它所需要的对象的类。在工厂方法模式中,我们不需要具体产品的类名,我们只需要知道创建它的具体工厂即可。
2、一个类通过其子类来指定创建那个对象。在工厂方法模式中,对于抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,在程序运行时,子类对象将覆盖父类对象,从而使得系统更容易扩展。
3、将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时可以无须关心是哪一个工厂子类创建产品子类,需要时再动态指定。
优缺点
优点
1、 在工厂方法中,用户只需要知道所要产品的具体工厂,无须关系具体的创建过程,甚至不需要具体产品类的类名。
2、 在系统增加新的产品时,我们只需要添加一个具体产品类和对应的实现工厂,无需对原工厂进行任何修改,很好地符合了“开闭原则”。
缺点
1、 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,是的系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。