工厂模式虽然简单,但是写下这篇文章却不简单。第一:本人经过内心的挣扎后才决定开始写博文的,为什么呢,因为好长时间没有写了,对自己的文学功底也是好不自信,但是技术这东西你不写出来你真不知道自己掌握多少,或者是否掌握其本质;第二:老婆怀孕了,没时间写了,但是我还是挤出时间开始写,于是这篇文章在这样的环境下成了,以后还有后续的文章,谢谢关注!
为什么从设计模式开始学习呢?其实以前对设计模式有些了解,但是用不到也就没有深入,现在差不多也忘完了,本人工作三年了,对一些大众上的技术(比如struts2、spring、hibernate)已经差不多学习差不多了,技术人员嘛,不能一直停留在表层,不能只会编码,更要学会设计,所以就先拿设计模式开刀。
关于设计模式这一块的书籍和博文不少,本人感觉《《大话设计模式》》这本书讲的非常不错,它以诙谐幽默的形式进行讲解,并且是循序渐进的,对此感触颇深。该系列博文是对《《大化设计模式》》一书的学习总结,并用java语言(书中例子用c#写的)进行代码演示,保证彻底理解,也留个笔记。
书中介绍简单工厂模式是以一道程序代码开始的,是一个计算器控制台程序,要用面向对象的思想实现,对于大学刚毕业的学生估计会像“小菜”(书中人物)一样,直接进行加减乘除计算,这样做的缺点:1、不适用,并且代码冗余;2、不易维护、不易扩展、不易复用。
一个菜鸟到高手到大神这一过程的蜕变其实就是对这些代码进行优化,其实学的技术都是一样的,但是使用程度上、熟练程度上有差距罢了。
真啰嗦,第一次写嘛,给点面子
简单模式:是由一个工厂对象决定创建出哪一种产品类的实例。
例子来了
1、定义个抽象类,包括实例对象公共的属性
/*
*不能定义为接口,因为接口不能定义变量,可以定义常量
* 1、其实这样设计有问题,假如有多个参数怎么办?不能都定义在抽象类里吧
* 2、如果操作符很多怎么办?总不能一个操作定义一个类吧。
*/
publicabstractclass Operation {
publicdoublenumberA;
publicdoublenumberB;
publicabstractdouble getResult();
}
2、加法算法,继承Operation就好了
publicclass OperationAddextendsOperation{
publicdouble getResult(){
returnnumberA +numberB;
}
}
3、减法算法,同理
publicclass OperationSubextendsOperation{
publicdouble getResult(){
returnnumberA -numberB;
}
}
4、乘除算法就略了,都是一样的。工厂类来了,功能就是要什么算法就生产什么算法
publicclass OperationFactory {
//定义静态方法,目的是对象直接调用
publicstatic Operation createOperation(Stringoperation){
Operation oper = null;
//jdk1.7以上支持字符串
switch (operation) {
case"+":
oper = newOperationAdd();
break;
case"-":
oper = newOperationSub();
break;
//......省略
default:
break;
}
return oper;
}
}
5、好了,最后客户端调用一下试试
publicclass OperationClient {
/**
* @param args
*/
publicstaticvoid main(String[] args) {
// TODO Auto-generated method stub
Operation operation = OperationFactory.createOperation("+");
operation.numberA = 1;
operation.numberB = 2;
System.out.println("参数相加等于:"+operation.getResult());
Operation operation1 = OperationFactory.createOperation("-");
operation1.numberA = 8;
operation1.numberB = 2;
System.out.println("参数相减等于:"+operation1.getResult());
}
}
6、附上UML类图,学会画类图很重要啊
总结:编程是一门技术,更是一门艺术,不能满足于写完代码运行正常就完事,时常考虑如何让代码更加简洁、更加容易维护、复用和可扩展,只有这样才能不断提高。写出优雅的代码是一种很爽的事情,所谓学无止境,其实这才是理解面向对象的开始呢。
附上源码地址(csdn好像不能上传附件,只能附上地址了):http://download.csdn.net/detail/jzhf2012/8082159