简单工厂模式:
体现出了java面向对象的三大特征--封装,继承,多态。例如我们要实现一个运算器,具有简单的两数加减运算。这时考虑到类的复用性,我们会将运算类封装起来。考虑到可扩展性,例如想在此基础上增加乘除运算,而不会使原来的加减运算暴露出来受到影响,会将加减运算分别写成独立的类
至于多态,则要介绍到简单工厂模式,看一下类图:
简单的来说简单工厂模式就是由一个工厂类根据传入的参量来创建不同的产品类。工厂类中包含了这些产品类的抽象父类或者接口。创建出的子类通过上转型对象赋值给父类。在客户端进行调用时,应用类的多态性,实现相应子类的功能。
package moshi;
/*
* 抽象父类
*/
abstract class Operator
{
protected int operatA;
protected int operatB;
public abstract long getResult();
public int getOperatA() {
return operatA;
}
public void setOperatA(int operatA) {
this.operatA = operatA;
}
public int getOperatB() {
return operatB;
}
public void setOperatB(int operatB) {
this.operatB = operatB;
}
}
/*
* 子类
*/
class OperatAdd extends Operator
{
@Override
public long getResult()
{
return operatA + operatB;
}
}
class OperatSub extends Operator
{
@Override
public long getResult()
{
return operatA - operatB;
}
}
/*
* 工厂类,根据传入的参数的不同来创建不同的子类实例
*/
class Factory
{
public static Operator createOperator(String oper)
{
Operator operator = null;
switch(oper)
{
case "+":
operator = new OperatAdd();
break;
case "1":
operator = new OperatSub();
break;
}
return operator;
}
}
public class Test
{
public static void main(String[] args)
{
Factory factory = new Factory();
Operator operator = factory.createOperator("+"); //如果使用减法运算,只需更改传入的参数
operator.setOperatA(2);
operator.setOperatB(3);
System.out.println(operator.getResult());
}
}
这样,由工厂类负责创建不同子类的实例,如果想使用减法运算,只需改变测试类中传入到工厂中的参数即可
如果想增加其他的运算,则只需让运算继承抽象父类,并在工厂类中增加相应的创建方法,已经存在的加减运算不会受到任何的影响。
简单工厂模式已经部分符合开闭原则,以及客户不能依赖于具体的类而应该依赖于抽象的设计原则。但是这样虽然削弱了客户端对接口实例的依赖,但是工厂类对其的依赖仍然很强。为了解决这个问题,就要用到动态工厂模式。
链接地址: 点击打开链接