最近學習到設計模式,現總結個人學習工廠模式内容。
上一篇:Java設計模式-模闆模式
文章目錄
- 定義
- 優缺點
-
- 優點
- 缺點
- 實作
-
- 簡單工廠
-
- 第一步:工廠生産汽車
- 第二部:測試,這裡作為客戶需要知道每一個汽車的名稱,但是不關心生産過程。
- 工廠方法
-
- 第一步:定義接口
- 第二部:廠商生産汽車
- 第三步:測試,使用者不需要知道汽車名稱,但是需要知道汽車廠商。
- 抽象工廠
-
- 第一步:定義抽象方法
- 第二部:廠商實作相關方法
- 第三步:測試,工廠統一處理内部關聯很強的産品。但是擴充很麻煩,需要統一修改接口,并同時添加其他産品,每一個實作接口的類都需要修改。
定義
工廠模式屬于建立型模式,它提供了一種建立對象的方式,不在是我們自己建立對象,而是通過工廠的方式幫助我們建立對象,不對用戶端暴露建立邏輯。
優缺點
優點
- 一個調用者想建立一個對象,隻要知道其名稱就可以了。
- 擴充性高,如果想增加一個産品,隻要擴充一個工廠類就可以。
- 屏蔽産品的具體實作,調用者隻關心産品的接口。
缺點
- 每次增加一個産品時,都需要增加一個具體類和對象實作工廠
- 使用者需要知道工廠資訊
實作
這裡以生産汽車進行擴充,以五菱宏光和解放牌為例。
汽車代碼
簡單工廠
第一步:工廠生産汽車
import template.factory.car.Car;
import template.factory.car.JieFangCar;
import template.factory.car.WulingCar;
/**
* 簡單工廠
* @author cc百川
* 一個工廠做很多事,同時需要使用者清楚的知道,
* 每一個汽車的名稱,明顯不利擴充,而且新增汽車需要修改這個工廠。
*/
public class SimpleFactory {
public Car getCar(String carName){
if("JieFang".equals(carName)) {
return new JieFangCar();
} else if("Wuling".equals(carName)) {
return new WulingCar();
}
return null;
}
}
第二部:測試,這裡作為客戶需要知道每一個汽車的名稱,但是不關心生産過程。
工廠方法
第一步:定義接口
/**
* 工廠接口制定規則,各個廠商自己實作執制
* 造邏輯,我們這裡隻關心結果是一輛車就好。
* 後面有新的汽車廠商隻需要實作接口,生産汽車即可
* @author cc百川
*
*/
public interface Factory {
Car getCar();
}
第二部:廠商生産汽車
解放牌類
/**
* 解放牌汽車廠生成汽車
* @author cc百川
*/
public class JieFangFactory implements Factory{
@Override
public Car getCar() {
System.out.println("我們是解放牌汽車生産廠,生産國産汽車");
return new JieFangCar();
}
}
五菱類
/**
* 五菱宏光
* @author cc百川
*/
public class WulingFactory implements Factory{
@Override
public Car getCar() {
System.out.println("五菱之光秋名山之神車");
return new WulingCar();
}
}
第三步:測試,使用者不需要知道汽車名稱,但是需要知道汽車廠商。
抽象工廠
第一步:定義抽象方法
/**
* 定義了抽象接口,注意工廠中生産的是關聯
* 産品,不然的話,就可以分開定義工廠了
* @author cc百川
*/
public abstract class AbstrFactory {
//這裡假定口罩,汽車,公路是有聯系的
abstract Car createCar();//制造汽車
abstract String createMask();//制造口罩
abstract String createHighway();//執照公路
}
第二部:廠商實作相關方法
解放牌類
import template.factory.car.Car;
import template.factory.car.JieFangCar;
public class JieFangAbstrFactory extends AbstrFactory{
@Override
Car createCar() {
return new JieFangCar();
}
@Override
String createMask() {
return "生産解放牌口罩";
}
@Override
String createHighway() {
return "改革開放的春風吹呀吹,解放牌修路中";
}
}
五菱宏光類
import template.factory.car.Car;
import template.factory.car.WulingCar;
public class WulingFactory extends AbstrFactory {
@Override
Car createCar() {
return new WulingCar();
}
@Override
String createMask() {
return "參與口罩生産之五菱牌口罩";
}
@Override
String createHighway() {
return "正在修秋名山公路中";
}
}
第三步:測試,工廠統一處理内部關聯很強的産品。但是擴充很麻煩,需要統一修改接口,并同時添加其他産品,每一個實作接口的類都需要修改。
日常生活中生産水的工廠,生産蔬菜的工廠等等,以及常見的spring的BeanFactory。
以上僅為個人學習,如果錯誤望指出,謝謝。