工厂模式(FactoryPattern)
适用于生成复杂对象,且个对象之间有一定的共同属性,将共同属性抽象成一个类或接口(Operation.java)模型,其他实现具体功能的类(OperationAdd.java、 OperationSub.java、 OperationMul.java、 OperationDiv.java),继承(实现)共有属性。工厂类(OperationFactory.java)创建一个共有属性对象,对象的实体化依据客户端的需求(制造指定产品)。
客户端:只需要知道工厂接口(OperationFactory)和模型(共同属性)(Operation)就可以完成相应的操作。
工厂模式的优点:
1、一个调用者想创建一个对象,只要知道其名称就可以了。
2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
3、屏蔽产品的具体实现,调用者只关心产品的接口。
工厂模式的缺点:
每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
工厂类:(根据客户端的需求生成不同的产品)
package core;
public class OperationFactory {
public static Operation createOperate(String operate)
{
Operation oper = null;
switch (operate)
{
case "+":
oper = new OperationAdd();
break;
case "-":
oper = new OperationSub();
break;
case "/":
oper = new OperationDiv();
break;
case "*":
oper = new OperationMul();
break;
}
return oper;
}
}
运算类:(共同属性)
package core;
public class Operation {
private double numberA = 0;
private double numberB = 0;
public double get_numberA() {
return numberA;
}
public void set_numberA(double _numberA) {
this.numberA = _numberA;
}
public double get_numberB() {
return numberB;
}
public void set_numberB(double _numberB) {
this.numberB = _numberB;
}
public double GetResult() throws Exception
{
double result = 0;
return result;
}
}
Server客户端:
package Server;
import core.Operation;
import core.OperationFactory;
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Operation oper;
oper = OperationFactory.createOperate("*");
oper.set_numberA(3);
oper.set_numberB(3);
double result;
try {
result = oper.GetResult();
System.out.println(result);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
实现不同运算功能:
package core;
public class OperationAdd extends Operation {
@Override
public double GetResult()
{
double result = 0;
result = super.get_numberA() + super.get_numberB();
return result;
}
}
package core;
public class OperationSub extends Operation {
@Override
public double GetResult()
{
double result = 0;
result = super.get_numberA() - super.get_numberB();
return result;
}
}
package core;
public class OperationMul extends Operation {
@Override
public double GetResult()
{
double result = 0;
result = super.get_numberA() * super.get_numberB();
return result;
}
}
package core;
public class OperationDiv extends Operation {
@Override
public double GetResult() throws Exception
{
double result = 0;
if(super.get_numberB() == 0)
throw new Exception("除数不能为0。");
result = super.get_numberA() / super.get_numberB();
return result;
}
}