简单工厂设计模式

简单工厂设计模式

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分支,这就修改类原有的类,这样不仅扩展开放,同时对修改也开放了,这就违背了”封闭-开发“原则。


下一篇:工厂设计模式解决最后留下的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值