以计算器为例:
简单工厂模式:
abstract class Operation{
private double numberA=0;
private double numberB=0;
boolean flag=true;
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();
}
class OperationAdd extends Operation{
@Override
public double getResult() {
// TODO Auto-generated method stub
double result=0;
return getNumberA()+getNumberB();
}
}
class OperationSub extends Operation{
@Override
public double getResult() {
// TODO Auto-generated method stub
double result=0;
return getNumberA()-getNumberB();
}
}
class OperationMul extends Operation{
@Override
public double getResult() {
// TODO Auto-generated method stub
double result=0;
return getNumberA()*getNumberB();
}
}
class OperationDiv extends Operation{
@Override
public double getResult() {
// TODO Auto-generated method stub
double result=0;
return getNumberA()/getNumberB();
}
}
//简单工厂类
class OperationFacotry{
public static Operation createOperate(String operate) {
Operation oper=null;
switch(operate) {
case "+": oper=new OperationAdd();break;
case "-": oper=new OperationSub();break;
case "*": oper=new OperationMul();break;
case "/": oper=new OperationDiv();break;
}
return oper;
}
}
public class Main{
public static void main(String[] args) {
Operation oper;
oper=OperationFacotry.createOperate("+");
oper.setNumberA(1);
oper.setNumberB(2);
System.out.println(oper.getResult());
}
}
简单工厂模式缺点:对扩展开放,对修改也开放,不满足开放-封闭原则。
改进:
工厂方法模式
abstract class Operation{
private double numberA=0;
private double numberB=0;
boolean flag=true;
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();
}
class OperationAdd extends Operation{
@Override
public double getResult() {
// TODO Auto-generated method stub
double result=0;
return getNumberA()+getNumberB();
}
}
class OperationSub extends Operation{
@Override
public double getResult() {
// TODO Auto-generated method stub
double result=0;
return getNumberA()-getNumberB();
}
}
class OperationMul extends Operation{
@Override
public double getResult() {
// TODO Auto-generated method stub
double result=0;
return getNumberA()*getNumberB();
}
}
class OperationDiv extends Operation{
@Override
public double getResult() {
// TODO Auto-generated method stub
double result=0;
return getNumberA()/getNumberB();
}
}
//创建一个工厂接口
interface IFactory{
Operation CreateOperation();
}
//加减乘除各创建一个具体工厂来实现工厂接口
class AddFactory implements IFactory{
@Override
public Operation CreateOperation() {
// TODO Auto-generated method stub
return new OperationAdd();
}
}
class SubFactory implements IFactory{
@Override
public Operation CreateOperation() {
// TODO Auto-generated method stub
return new OperationSub();
}
}
class MulFactory implements IFactory{
@Override
public Operation CreateOperation() {
// TODO Auto-generated method stub
return new OperationMul();
}
}
class DivFactory implements IFactory{
@Override
public Operation CreateOperation() {
// TODO Auto-generated method stub
return new OperationDiv();
}
}
public class Main{
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
IFactory operFactory=null;
System.out.println("请选择运算符:");
String strOperator =cin.nextLine();
switch(strOperator.charAt(0)) {
case'+':operFactory=new AddFactory();break;
case'-':operFactory=new SubFactory();break;
case'*':operFactory=new MulFactory();break;
case'/':operFactory=new DivFactory();break;
}
Operation oper=operFactory.CreateOperation();
oper.setNumberA(1);
oper.setNumberB(2);
System.out.println(oper.getResult());
}
}