設計模式之工廠模式

現在我的感覺是,之所以花大力氣,學習設計模式,主要是爲了程序以後的擴展,而我也越來越意識到,程序擴展的重要性。而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實現產生運算累得方法

再客戶端程序需要改下,具體的工廠。那個更好呢?老鳥是這麼說的  簡單工廠違背了開放封閉原則(軟件實體《類,模塊,函數等》應該可以擴展但不可已修改),但保持了封裝對象創建過程的優點,這兩種途徑都是集中封裝了對象的創建過程,使得更換對象時,不許要做大的改動就可以實現,降低了客戶端程序域產品對象的耦合,抽象工廠模式是簡單工廠模式的進一步抽象和推廣(摘自大話設計模式)


老鳥是菜鳥進步的階梯 再次感謝那些樂於分享經驗的老鳥  


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章