简单工厂设计模式
1、简单工厂设计模式
定义:一个类中的一个方法来负责创建其他类的实例,被创建的实例通常都具有共同的父类或接口。简单抽象工厂模式又叫静态工厂设计模式,属于类的创建型模式,通常根据一个条件(参数)来返回不同类的实例。
简单工厂设计模式不能说是一个设计模式。它不是23种GOF设计模式之一。但它在实际的编程中经常被用到,思想也非常简单,可以说是工厂设计模式的一个引导。
2、简单工厂设计模式UML图
这里以一个简单的计算器为实例,简单工厂设计模式UML图
3、思路:
(1)业务逻辑和界面相互分离,降低它们之间的耦合度,这样才可以达到容易维护或扩展。
(2)遵循类设计的“单一职责”(即一个类只完成一个功能)。
4、步骤:
(1)抽象出一个操作类即Operator,该类具有具体功能类的方法。
(2)创建出4个Add、Sub、Mul、Div,让其继承Operator类,覆盖其父类方法getResult()。
(3)SimpleFactory类,构建一个方法让其判断产生具体的那个功能类,让父类指向其子类。
5、代码
package designPattren;
/**
* 被零除异常类,对被零除异常的声明
* @author hjyang
* */
@SuppressWarnings("serial")
class ArithmeticExceptionByZero extends RuntimeException{
ArithmeticExceptionByZero(String msg){
super(msg);
}
}
abstract class Operator{
protected double num1;
protected double num2;
protected double result;
public void setValue(double num1, double num2){
this.num1 = num1;
this.num2 = num2;
}
abstract public double getResult();
}
class Add extends Operator{
public double getResult(){
this.result = this.num1 + this.num2;
return result;
}
}
class Sub extends Operator{
public double getResult(){
this.result = this.num1 - this.num2;
return result;
}
}
class Mul extends Operator{
public double getResult(){
this.result = this.num1 * this.num2;
return result;
}
}
class Div extends Operator{
public double getResult(){
try{
if(this.num2 == 0){
throw new ArithmeticExceptionByZero("除数不能为零!");
}
}catch(ArithmeticExceptionByZero e){
System.out.println(e.toString());
System.exit(0);
}
this.result = this.num1 / this.num2;
return result;
}
}
class OperatorFactory{
public static Operator createOperator(char operate){
Operator opt = null;
switch(operate){
case '+':
opt = new Add();
break;
case '-':
opt = new Sub();
break;
case '*':
opt = new Mul();
break;
case '/':
opt = new Div();
break;
default:
System.out.println("输入运算符不正确,请重新输入!");
System.exit(0);
}
return opt;
}
}
public class SingleResponsibility {
public static void main(String[] args){
double num1=2,num2=6;
Add a = new Add();
a.setValue(num1, num2);
System.out.println("Add:" + a.getResult());
Sub s = new Sub();
s.setValue(num1, num2);
System.out.println("Sub:" + s.getResult());
Mul m = new Mul();
m.setValue(num1, num2);
System.out.println("Mul:" + m.getResult());
Div d = new Div();
d.setValue(num1, num2);
System.out.println("Div:" + d.getResult());
Operator opt;
char operate = '-';
double num1=2,num2=4;
opt = OperatorFactory.createOperator(operate);
opt.setValue(num1, num2);
System.out.println(opt.getClass().getName() +":"+ opt.getResult());
}
}
总结:
(1)以上代码采用面向对象三特特性:封装、继承、多态机制,并且符合"单一职责"原则
(2)以上代码首先是一个运算类,它具有2个number属性,主要用于计算前后数,result保存运算结果,然后有一个抽象方法getResult()用于得到结果,而加、减、乘、除都继承类运算类Operator,重写了getResult()方法,这样如果要修改任何一个算法,就不需要提供其他算法的代码了。
(3)简单工厂设计模式的最大优点碍于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说去除了对产品的依赖。但是如果需要添加一个功能,如求N次幂,即必须给运算工厂类的方法switch语句,加上case分支,这就修改类原有的类,这样不仅扩展开放,同时对修改也开放了,这就违背了”封闭-开发“原则。
下一篇:工厂设计模式解决最后留下的问题。