设计模式之-简单工厂模式

简单工厂模式,这是《大话设计模式》开篇讲解的内容,以一个面试题引出,步步逼近,讲的很好,详细见该书;它从最初的代码讲起,一直到最后应用到了设计模式-简单工厂模式;其中用到了类的三大特性:封装、继承、多态;在这里我不再一一讲解,只是把完整的代码贴上来供参考(稍微做了修改):

1、抽象类-Operation,该类只有一个抽象方法,负责计算各种运算,其实现由实现类完成;

public abstract class Operation {	
	
	public abstract double operate(double number1, double number2);

}

2、 接下来是各种计算类,他们继承了上面的抽象类,并根据运算实现了里面的抽象方法;

public class Add extends Operation {

	@Override
	public double operate(double number1, double number2) {
		
		return number1 + number2;
	}

}

public class Sub extends Operation {

	@Override
	public double operate(double number1, double number2) {
		
		return number1 - number2;
	}

}

public class Multip extends Operation{

	@Override
	public double operate(double number1, double number2) {
		
		return number1 * number2;
	}

}

public class Division extends Operation {

	@Override
	public double operate(double number1, double number2) {
		if (number2 == 0) {
			System.out.println("the second can not be zero");
			return 0;
		}
		else return number1 / number2;
	}

}
3、接下来就用到了简单工厂模式,ObjectFactory类负责创建对象,也就是根据提供的操作符决定创建哪个类对象;

public class ObjectFactory {
	
	public static Operation getOperation(char operCharacter) {
		Operation operation = null;
		switch(operCharacter) {
			case '+': operation = new Add();break;
			case '-': operation = new Sub();break;
			case '*': operation = new Multip();break;
			case '/': operation = new Division();break;
		}
		return operation;
	}
}
其实使用这样的方法来设计该面试题有很多的好处:

首先是复用性,不管是什么操作只要提供了操作符,在程序的入口调用工厂类中的方法就可以得到相应的操作对象,进而调用相应的方法计算得出结果

其次是容易扩展,如果要增加某一个运算,只需要添加一个Operation类的实现类并根据需要重写里面的抽象方法,然后再工厂类中增加一个分支即可,这其实也和面向接口编程差不多;同时避免了去修改原来的功能性代码;真可谓是一石多鸟啊!!


但是这样的简单工厂模式有没有问题呢?答案是有的,在软件开发过程中有一个非常重要的原则需要遵守:开-闭原则(open-close-rules,简称为OCR);简单的说就是对扩展开放,而不修改关闭。什么意思呢,也就是说对于开发好的软件对于扩展是非常方便的,而且尽量不去更改已经写好的功能型代码,避免了重新编译减少了工作量,这也就是对修改关闭;


再回过来看看上面写好的代码,当要增加一个运算的时候,除了增加一个类(这个是必须的)继承抽象类Operation之外,还要在工厂类中增加一个分支,这就违背了OCR;那么怎么解决呢?看下一篇文章:工厂方法




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心所向皆可成

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值