工厂方法模式
工厂方法模式是简单工厂模式的进步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且部分克服了它的缺点。
抽象工厂角色: 是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。如本例中的OperationFactory。
具体工厂角色: 这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。如本例中的OperationAddFactory、OperationMulFactory、OperationSubFactory。
抽象产品角色: 工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。如本例中的Operation。
具体产品: 具体产品(Concrete Product万角色: 这个角色实现了抽象产品角色所定义的接口。谋具体产品有专门的具体工厂创建,它们之间往往一-- 对应。如本例中的OperationAdd、OperationSub、OperationMul。
工厂方法模式结构图
本例是对计算器的工厂方法模式
抽象工厂以及工厂类:
public interface OperationFactory {
public Operation CreaOperationt();
}
public class OperationAddFactory implements OperationFactory {
@Override
public Operation CreaOperationt() {
// TODO Auto-generated method stub
return new OperationAdd();
}
}
public class OperationMulFactory implements OperationFactory {
@Override
public Operation CreaOperationt() {
// TODO Auto-generated method stub
return new OperationMul();
}
}
public class OperationSubFactory implements OperationFactory {
@Override
public Operation CreaOperationt() {
// TODO Auto-generated method stub
return new OperationSub();
}
}
抽象产品已具体产品类
public abstract class Operation {
private double numberA;
private double numberB;
public double getNumberA() {
return numberA;
}
public void setNumberA(double numberA) {
this.numberA = numberA;
}
public double getNumberB() {
return numberB;
}
public void setNumberB(double numberB) {
this.numberB = numberB;
}
public abstract double getResult();
}
public class OperationAdd extends Operation{
@Override
public double getResult() {
// TODO Auto-generated method stub
return super.getNumberA()+super.getNumberB();
}
}
public class OperationMul extends Operation{
@Override
public double getResult() {
// TODO Auto-generated method stub
return super.getNumberA()*super.getNumberB();
}
}
public class OperationSubFactory implements OperationFactory {
@Override
public Operation CreaOperationtFactory() {
// TODO Auto-generated method stub
return new OperationSub();
}
}
客户端:
import java.util.Scanner;
public class Program {
public static void main(String[] args) {
OperationFactory of = new OperationAddFactory();
Operation oper = of.CreaOperationt();
oper.setNumberA(1.0);
oper.setNumberB(1.0);
System.out.println("结果为"+oper.getResult());
}
}
补充++++++ 上面客户端代码没有完成真正的计算器功能。。。但实现了工厂模式主要是想锻炼一下工厂模式
UML类图
工厂方法模式的优点:
- 很好体现了**“依赖倒置原则”**
- 工厂方法模式使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的“上帝类”。这样便分担了对象承受的压力;而且这样使得结构变得灵活起来——当有新的产品产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已有的代码。可以看出工厂角色的结构也是符合开闭原则的!而简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性不好。
工厂方法模式的缺点:
- 工厂方法是要创建产品对象的,也就是需要选择具体的产品对象,并创建他们的实例。因此具体产品对象与工厂方法是耦合的。工厂方法模式仿佛已经很完美的对对象的创建进行了包装,使得客户程序中仅仅处理抽象产品角色提供的接口,但使得对象的数量成倍增长。当产品种类非常多时,会出现大量的与之对应的工厂对象,这不是我们所希望的。