天天看點

java設計模式之工廠模式設計模式總結:

設計模式

為了重用代碼,解耦,讓代碼更容易被任了解/保證代碼可靠性。

1.簡單工廠

1.描述:顧名思義,這個模式本身很簡單,而且使用在業務模式較簡單的情況下。

2.關鍵點

1.工廠類角色:這是本模式的核心,含有一定的商業邏輯和判斷邏輯。在java中它往往由一個具體類實作。

package com.lpw.simple;

// 生産卡車的工廠類
public class TrunkFactory {
	
	// 不管是寶馬還是奧迪都是卡車
	public static Trunk geTrunk(String message) {
		
//		if("寶馬".equals(message)){
//			return new BMwTrunk_s();
//		}else if ("奧迪".equals(message)) {
//			return new AodiTrunk_s();
//		}else {
//			throw new RuntimeException("沒有您要的車,可能還沒有創造……");
//		}
		
		switch (message) {
		case "寶馬":
			
			return new BMwTrunk_s();
		case "奧迪":
			
			return new AodiTrunk_s();
		default:
			return null;
		}
		
		
	}
}
           

2.抽象産品角色:它一般是具體産品繼承的父類或者實作的接口。在java中由接口或者抽象類來實作。

package com.lpw.simple;

// 抽象(卡車)
public interface Trunk {
	
	public void run();
}
           

3.具體産品角色:工廠類所建立的對象就是此角色的執行個體在java中由一個具體類實作。

package com.lpw.simple;

public class AodiTrunk_s implements Trunk{

	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println("奧迪卡車啟動……");
	}

}
           
package com.lpw.simple;

public class BMwTrunk_s implements Trunk{

	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println("寶馬卡車啟動……");
	}

}
           

3.開閉原則分析簡單工廠模式

對擴充開放,對修改封閉一個軟體應該通過擴充來實作變化,而不是通過修改已有的代碼來實作變化的。

若新增一個大衆汽車

package com.lpw.simple;

public class DaZTrunk implements Trunk{

	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println("大宗在運作……");
	}

}
           

就需要修改工廠類,

package com.lpw.simple;

// 生産卡車的工廠類
public class TrunkFactory {
	
	// 不管是寶馬還是奧迪都是卡車
	public static Trunk geTrunk(String message) {
		
//		if("寶馬".equals(message)){
//			return new BMwTrunk_s();
//		}else if ("奧迪".equals(message)) {
//			return new AodiTrunk_s();
//		}else {
//			throw new RuntimeException("沒有您要的車,可能還沒有創造……");
//		}
		
		switch (message) {
		case "寶馬":
			
			return new BMwTrunk_s();
		case "奧迪":
			
			return new AodiTrunk_s();
		case "大衆":
			
			return new DaZTrunk();
		default:
			return null;
		}
		
		
	}
}
           

是以違反了,開閉原則。

4.缺點

簡單工廠模式,違反開閉原則。擴充性差。

2. 工廠方法

1.描述

定義一個建立對象的工廠接口,讓子類決定執行個體化哪一個類,将實際工作交給子類。

2. 關鍵點

1. 抽象工廠角色:這是工廠方法模式的核心。是具體工廠角色必須實作的接口或者必須繼承的父類。在java中它由抽象類或者接口來實作。

package com.lpw.methord;


// 抽象工廠
public interface TrunkFactory_M {
	
	public Trunk_M createTrunk();
}
           

2.具體工廠角色:它包含和具體業務邏輯有關的代碼。建立對應的具體産品的對象。在java中它由具體的類來實作。

package com.lpw.methord;

public class AodeTrunkFactory implements TrunkFactory_M{

	@Override
	public Trunk_M createTrunk() {
		// TODO Auto-generated method stub
		
		return new AodiTrunk_M();
	}

}
           
package com.lpw.methord;

public class BmwTrunkFactory implements TrunkFactory_M{

	@Override
	public Trunk_M createTrunk() {
		// TODO Auto-generated method stub
		return new BMwTrunk_M();
	}

}
           

3. 抽象的産品角色:它是具體産品繼承的父類或者實作的接口。

package com.lpw.methord;

// 抽象(卡車)
public interface Trunk_M {
	
	public void run();
}
           

4.具體産品角色:具體工廠角色所建立的對象就是此角色的執行個體。在java中由具體的類來實作。

package com.lpw.methord;

public class BMwTrunk_M implements Trunk_M{

	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println("寶馬卡車啟動……");
	}

}
           
package com.lpw.methord;

public class AodiTrunk_M implements Trunk_M{

	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println("奧迪卡車啟動……");
	}

}
           

3.問題

工廠方法模式足以應付我們可能遇到的大部分業務需求,但當産品種類非常多的時候回怎麼樣呢?

4. 分析優缺點

優點:更符合開閉原則:新增一種産品時,隻需要增加相應的具體産品和相應的工廠子類即可

符合單一職責原則:每個具體工廠類隻負責建立對應的産品。

缺點:在增加一個新産品的時候,需要增加一個産品類和一個具體的子工廠,給系統增加負擔的同時,每個工廠生産一種産品,太過單一;

3. 抽象工廠

1.描述

給用戶端提供一個借口,可以建立多個産品族中的産品對象

2.關鍵點

1.抽象工廠角色:這是工廠方法模式的核心,是具體工廠角色必須實作的接口或者必須繼承的父類。在java中它由抽象類或者接口來實作。

package com.lpw.abstr;

public interface CarFacory {
	// 生産卡車
	public Trunk_A produceTrunk();
	// 生産轎車
	public Sedan produceSedan();
}
           

2.具體工廠角色:它含有和具體業務邏輯有關的代碼。建立對應的具體産品的對象。在java中它由具體的類來實作。

package com.lpw.abstr;

public class BwmFactory implements CarFacory{

	@Override
	public Trunk_A produceTrunk() {
		// TODO Auto-generated method stub
		return new BwmTrunk();
	}

	@Override
	public Sedan produceSedan() {
		// TODO Auto-generated method stub
		return new BwmSedan();
	}

}
           
package com.lpw.abstr;

public class AodiFactory implements CarFacory{

	@Override
	public Trunk_A produceTrunk() {
		// TODO Auto-generated method stub
		return new AodiTrunk();
	}

	@Override
	public Sedan produceSedan() {
		// TODO Auto-generated method stub
		return new AodiSedan();
	}

}
           

3.抽象産品角色:它是具體産品繼承的父類或者是實作的接口。在java中一般有抽象類或者接口來實作。

package com.lpw.abstr;

// (抽象)轎車
public interface Sedan {
	// 轎車的啟動方法
	public void run();

}
           
package com.lpw.abstr;

// (抽象)卡車
public interface Trunk_A {
	
	// 卡車對的啟動時間
	public void run();
}
           

4.具體産品角色:具體工廠角色所建立的獨享就是此角色的執行個體。在java中由具體的類來實作。

package com.lpw.abstr;

public class AodiSedan implements Sedan{

	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println("奧迪轎車……");
	}

}
           
package com.lpw.abstr;

public class AodiTrunk implements Trunk_A{

	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println("奧迪卡車……");
	}

}
           
package com.lpw.abstr;

public class BwmSedan implements Sedan{

	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println("儲存嗎轎車在運作……");
	}

}
           
package com.lpw.abstr;

public class BwmTrunk implements Trunk_A{

	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println("寶馬卡車在運作……");
	}

}
           

如果工廠的産品來自多個等級結構,則屬于抽象工廠模式。

總結:

無論是簡單工廠模式,工廠方法模式,還是抽象工廠模式,它們都屬于工廠模式,在形式和特點上也是極為相似的,它們的最終目的都是為了解耦。

使用工廠模式時,隻需要關心降低耦合度的目的是否達到了。

繼續閱讀