工廠模式雖然簡單,但是寫下這篇文章卻不簡單。第一:本人經過內心的掙扎後才決定開始寫博文的,爲什麼呢,因爲好長時間沒有寫了,對自己的文學功底也是好不自信,但是技術這東西你不寫出來你真不知道自己掌握多少,或者是否掌握其本質;第二:老婆懷孕了,沒時間寫了,但是我還是擠出時間開始寫,於是這篇文章在這樣的環境下成了,以後還有後續的文章,謝謝關注!
爲什麼從設計模式開始學習呢?其實以前對設計模式有些瞭解,但是用不到也就沒有深入,現在差不多也忘完了,本人工作三年了,對一些大衆上的技術(比如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