天天看點

Java設計模式-工廠模式定義優缺點實作

最近學習到設計模式,現總結個人學習工廠模式内容。

上一篇:Java設計模式-模闆模式

文章目錄

  • 定義
  • 優缺點
    • 優點
    • 缺點
  • 實作
    • 簡單工廠
      • 第一步:工廠生産汽車
      • 第二部:測試,這裡作為客戶需要知道每一個汽車的名稱,但是不關心生産過程。
    • 工廠方法
      • 第一步:定義接口
      • 第二部:廠商生産汽車
      • 第三步:測試,使用者不需要知道汽車名稱,但是需要知道汽車廠商。
    • 抽象工廠
      • 第一步:定義抽象方法
      • 第二部:廠商實作相關方法
      • 第三步:測試,工廠統一處理内部關聯很強的産品。但是擴充很麻煩,需要統一修改接口,并同時添加其他産品,每一個實作接口的類都需要修改。

定義

工廠模式屬于建立型模式,它提供了一種建立對象的方式,不在是我們自己建立對象,而是通過工廠的方式幫助我們建立對象,不對用戶端暴露建立邏輯。

優缺點

優點

  • 一個調用者想建立一個對象,隻要知道其名稱就可以了。
  • 擴充性高,如果想增加一個産品,隻要擴充一個工廠類就可以。
  • 屏蔽産品的具體實作,調用者隻關心産品的接口。

缺點

  • 每次增加一個産品時,都需要增加一個具體類和對象實作工廠
  • 使用者需要知道工廠資訊

實作

這裡以生産汽車進行擴充,以五菱宏光和解放牌為例。

汽車代碼

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;
	}
}
           

第二部:測試,這裡作為客戶需要知道每一個汽車的名稱,但是不關心生産過程。

Java設計模式-工廠模式定義優缺點實作

工廠方法

第一步:定義接口

/**
 * 工廠接口制定規則,各個廠商自己實作執制
 * 造邏輯,我們這裡隻關心結果是一輛車就好。
 * 後面有新的汽車廠商隻需要實作接口,生産汽車即可
 * @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();
	}
}

           

第三步:測試,使用者不需要知道汽車名稱,但是需要知道汽車廠商。

Java設計模式-工廠模式定義優缺點實作

抽象工廠

第一步:定義抽象方法

/**
 * 定義了抽象接口,注意工廠中生産的是關聯
 * 産品,不然的話,就可以分開定義工廠了
 * @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 "正在修秋名山公路中";
	}
}
           

第三步:測試,工廠統一處理内部關聯很強的産品。但是擴充很麻煩,需要統一修改接口,并同時添加其他産品,每一個實作接口的類都需要修改。

Java設計模式-工廠模式定義優缺點實作

日常生活中生産水的工廠,生産蔬菜的工廠等等,以及常見的spring的BeanFactory。

以上僅為個人學習,如果錯誤望指出,謝謝。

繼續閱讀