解释
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延期到其子类.
工厂模式的优点,克服了简单工厂违背开放-封闭原则(对扩展开放对更改封闭)的缺点
当然存在不足,新增一个产品就要增加一个产品的工厂类,增加了额外的开发量.
具体代码
抽象工厂
public interface IFactory {
Operation CreateOperation();
}
具体的工厂,加减乘除工厂
class AddFactory implements IFactory {
@Override
public Operation CreateOperation() {
return new OperationAdd();
}
}
class SubFactory implements IFactory {
@Override
public Operation CreateOperation() {
return new OperationSub();
}
}
class MulFactory implements IFactory {
@Override
public Operation CreateOperation() {
return new OperationMul();
}
}
class DivFactory implements IFactory {
@Override
public Operation CreateOperation() {
return new OperationDiv();
}
}
运算符类
public abstract class Operation {
private double nA = 0;
private double nB = 0;
public void setnA(double nA) {
this.nA = nA;
}
public void setnB(double nB) {
this.nB = nB;
}
public double getnA() {
return nA;
}
public double getnB() {
return nB;
}
public abstract double GetRsult();
}
具体产品角色。
class OperationAdd extends Operation {
@Override
public double GetRsult() {
return getnA() + getnB();
}
}
class OperationSub extends Operation {
@Override
public double GetRsult() {
return getnA() - getnB();
}
}
class OperationMul extends Operation {
@Override
public double GetRsult() {
return getnA() * getnB();
}
}
class OperationDiv extends Operation {
@Override
public double GetRsult() {
if (getnB() != 0) {
return getnA() / getnB();
}
return 0;
}
}
测试类
public class Main {
public static void main(String[] args) {
//如果是简单工厂要增加一个新算法例如立方,必须修改工厂类是不合适的
//工厂模式时候,只需要在客户端修改代码就可以了
IFactory operF = new AddFactory();
Operation oper = operF.CreateOperation();
oper.setnA(2);
oper.setnB(2);
System.out.print(oper.GetRsult());
}
}