現在我的感覺是,之所以花大力氣,學習設計模式,主要是爲了程序以後的擴展,而我也越來越意識到,程序擴展的重要性。而java之所以容易擴展主要得力與面向對象裏的繼承和多態。
今天寫了個工廠模式實驗代碼,在此記下來,留着以後學習回憶。
工廠方法模式與簡單工廠模式最大的區別在於: 簡單工廠最大的優點在於,工廠類中包含了必要的邏輯判斷,根據客戶端的選擇條件動態示例化相關的類,對於客戶端來說,去除了與具體產品的依賴。(出自大話設計模式)
它的uml建模圖據說是這樣的
第一次畫建模圖^_^
具體代碼就在這裏
package com.dic.simple.operation;
/**
* 運算類頂級接口
*
*
* @author roger.han([email protected])
*
*/
public interface Operation
{
/**
*
* @param a
* @param b
*/
public void operate(int a,int b);
}
package com.dic.simple.operation;
/**
* 加法操作的具體實現
*
* @author roger.han([email protected])
*
*/
public class AddOperation implements Operation{
/*
* (non-Javadoc)
* @see com.dic.simple.operation.Operation#operate(int, int)
*/
@Override
public void operate(int a,int b) {
// TODO Auto-generated method stub
System.out.println(a+b);
}
}
package com.dic.simple.operation;
/**
* 乘法運算的具體實現
*
* @author roger.han([email protected])
*
*/
public class MultiplyOperation implements Operation
{
/*
* (non-Javadoc)
* @see com.dic.simple.operation.Operation#operate(int, int)
*/
@Override
public void operate(int a, int b) {
// TODO Auto-generated method stub
System.out.println(a*b);
}
}
package com.dic.simple.factory;
import com.dic.simple.operation.AddOperation;
import com.dic.simple.operation.MultiplyOperation;
import com.dic.simple.operation.Operation;
/**
* 簡單工廠類 用於生成具體的操作對象 <span style="color:#ff0000;">具體生成對象的邏輯在簡單工廠裏實現</span>
*
* @author roger.han([email protected])
*
*/
public class SimpleFactory
{
/**
*
* @param i 此處偷懶,0-->add 1-->multiply
* @return
*/
public static Operation getOperation(int i)
{
Operation oper;
switch(i)
{
case 0:oper=new AddOperation();break;
case 1:oper=new MultiplyOperation();break;
default: return null;
}
return oper;
}
}
package com.dic.client;
import com.dic.simple.factory.SimpleFactory;
import com.dic.simple.operation.Operation;
/**
* 簡單工廠的調用客戶端
* @author roger.han([email protected])
*
*/
public class SimpleClient
{
public static void main(String[] args)
{
Operation o=SimpleFactory.getOperation(1);
o.operate(1, 2);
}
}
抽象工廠的uml圖據說是這樣
代碼是這樣
package com.dic.factory;
import com.dic.simple.operation.Operation;
/**
*
* 抽象工廠頂級接口類
*
*
*
* @author roger.han([email protected])
*
*/
public interface IFactory
{
public Operation getOperation();
}
package com.dic.factory;
import com.dic.simple.operation.AddOperation;
import com.dic.simple.operation.Operation;
/**
*
* 加法工廠 生產加法類
*
* @author roger.han([email protected])
*
*
*
*/
public class AddOperationFatory implements IFactory{
@Override
public Operation getOperation() {
// TODO Auto-generated method stub
return new AddOperation();
}
}
package com.dic.factory;
import com.dic.simple.operation.MultiplyOperation;
import com.dic.simple.operation.Operation;
/**
*
* 乘法工廠 生產乘法法類
*
* @author roger.han([email protected])
*
*
*
*/
public class MultiplyOperationFactory implements IFactory {
@Override
public Operation getOperation() {
// TODO Auto-generated method stub
return new MultiplyOperation();
}
}
package com.dic.client;
import com.dic.factory.IFactory;
import com.dic.factory.MultiplyOperationFactory;
import com.dic.simple.operation.Operation;
/**
* 抽象工廠調用客戶端
*
* @author work
*
*/
public class Client
{
public static void main(String[] args)
{
IFactory i=new MultiplyOperationFactory();//<span style="color:#ff0000;">而抽象工廠的邏輯在這裏</span>
Operation o=i.getOperation();
o.operate(1,2);
}
}
好了 終於把簡單工廠和抽象工廠寫完了 這時候如果想加個減法的話 簡單工廠需要怎麼做 而抽象工廠又需要怎麼做
簡單工廠要修改SimpleFactory的代碼 還有客戶端的代碼 來獲得減法類 ,抽象工廠又需要怎麼做,它需要寫一個新的工程 MinusFactory 來集成IIFactory實現產生運算累得方法
再客戶端程序需要改下,具體的工廠。那個更好呢?老鳥是這麼說的 簡單工廠違背了開放封閉原則(軟件實體《類,模塊,函數等》應該可以擴展但不可已修改),但保持了封裝對象創建過程的優點,這兩種途徑都是集中封裝了對象的創建過程,使得更換對象時,不許要做大的改動就可以實現,降低了客戶端程序域產品對象的耦合,抽象工廠模式是簡單工廠模式的進一步抽象和推廣(摘自大話設計模式)
老鳥是菜鳥進步的階梯 再次感謝那些樂於分享經驗的老鳥