java工廠模式


1、簡單模式
//所有車的接口  有一個共同改的方法 開車
public interface Car {
	public void drive();
}
//奧迪類  實現car接口因爲奧迪車也是車 肯定可以開的嘛
public class Audi implements Car {
	public Audi(){
		System.out.println("生產出一輛奧迪");
	}
	@Override
	public void drive() {
		System.out.println("開奧迪");
	}
}
//寶馬類  實現car接口因爲寶馬車也是車 肯定也可以開
public class Bmw implements Car{
	public Bmw(){
		System.out.println("生產出一輛寶馬");
	}
	@Override
	public void drive() {
		System.out.println("開寶馬");
	}
}
//生產車的工廠  該工廠接收一個車名 你只需要告訴他你要生產什麼車  就可以生產出對應的車出來
public class CarFactory {
	public static Car getCar(String caename){
		if(caename.equals("audi")){
			return new Audi();
		}else if(caename.equals("bmw")){
			return new Bmw();
		}
			return null;
	}
}
//測試
public class Test {
	public static void main(String[] args) {
		//告訴工廠類 你需要生產出一輛奧迪車  那麼給昂他傳一個參數audi進去
		Car audi = CarFactory.getCar("audi");
		//就可以生產出奧迪的車 調用開車的方法就可以開車啦
		audi.drive();
		//寶馬類似
		Car bmw = CarFactory.getCar("bmw");
		bmw.drive();
	}
}
輸出:
成產出一輛奧迪
開奧迪
生產出一輛寶馬
開寶馬
/**
*2、工廠方法模式
*根據以上代碼 大家可以發現 比傳統的new方法  Audi  audi = new Audi();要方便很多 如果說你因爲需求 要加一個奔馳的車  那你還要Bnez  benz = new Bnez(); 這樣的**話豈不是很麻煩,用工廠模式的話  客戶端就不用在new對象 將生成對象的細節可代碼都交給了工廠管理和實現 你只需要寫一個getObject();方法獲取到你想要的對象就ok了 *囚你要加一輛奔馳的話 只需要寫一個benz的類 實現car接口  然後在工廠類中進行添加相應的邏輯代碼就好了  
*這種模式雖然好一些 但是囚我們每次要加一個汽車類的話,都要在工廠類裏面修改判斷邏輯代碼,還是有一定的侷限性,不符合開閉原則,因此我們下面介紹更好一點的方式*:工廠方法模式
*/
//首先我們將carFactory工廠類 抽象成一個接口
public interface CarFactory {
	public Car getCar();
}
//然後我們再寫兩個首先該接口的具體工廠類(奧迪和寶馬)
public class AudiFactory implements CarFactory {
	@Override
	public Car getCar() {
		return new Audi();
	}
}
	public class BmwFactory implements CarFactory {
	@Override
	public Car getCar() {
		return new Bmw();
	}
}
//測試
public class Test {
	public static void main(String[] args) {
		//實例化奧迪工廠類
		CarFactory factory = new AudiFactory();
		//調用奧迪工廠類裏面的生產奧迪的方法
		Car audi = factory.getCar();
		audi.drive();
		//寶馬和奧迪一樣
		CarFactory factory2 = new BmwFactory();
		Car bmw = factory2.getCar();
		bmw.drive();
	}
}
輸出結果:
生產出一輛奧迪
開奧迪
生產出一輛寶馬
開寶馬
//這樣的話 奧迪工廠類  就只專注生產奧迪的車 寶馬一樣只生產寶馬車,如果我們需要加奔馳的話 只需要再寫一個上產奔馳的工廠類去實現CarFactory接口  和一個奔馳實///體類實現car接口就好了代碼如下:
public class Bnez implements Car{

	public Bnez() {
		System.out.println("生產出一輛奔馳");
	}
	@Override
	public void drive() {
		System.out.println("開奔馳");
	}
}
public class BnezFactory implements CarFactory{
	@Override
	public Car getCar() {
		return null;
	}
}
//在Test裏面調用:
CarFactory factory = new BenzFactory();
Car benz = factory.getCar();
benz.drive();
/**
*3、抽象工廠模式
*但是大家又會覺得 奧迪和寶馬也不止一種車啊   也有奧迪跑車 和奧迪越野車, 寶馬跑車和寶馬越野車啊 的確這樣 那麼以上兩種方就實現不了  因爲car這個接口就不能通*用了,他只能生產car,不能生產出跑車和越野車,所以第三種方法 我們需要將car這個接口裏面的getCar()方法變成兩個方法(一個上產跑車的方法getPaoche();一個生產越*野車的方法getYueye()) 所以引進第三種工廠模式:抽象工廠模式
*/
//跑車接口
public interface Paoche {
	public void drive();
}
//越野車接口
public interface Yueye {
	public void drive();
}
//那麼這樣的話奧迪車是不是就變成了兩個實體類了 之前只是一個audi這個類 現在變成了 奧迪跑車類和奧迪越野車類  加上寶馬的話就有四個具體實現的類了
//奧迪跑車
public class AudiPaoche implements Paoche {
	public AudiPaoche(){
		System.out.println("奧迪工廠上產出一輛奧迪跑車");
	}
	public void drive() {
		System.out.println("奧迪跑車在路上跑");
	}
}
//奧迪越野車
public class AudiYueye implements Yueye {
	public AudiYueye(){
		System.out.println("奧迪工廠生產出一輛奧迪越野車");
	}
	public void drive() {
		System.out.println("奧迪越野車在路上跑");
	}
}
//寶馬跑車
public class BmwPaoche implements Paoche{
	public BmwPaoche(){
		System.out.println("寶馬工廠生產出一輛寶馬跑車");
	}
	public void drive() {
		System.out.println("寶馬跑車在路上跑");
	}
}
//寶馬越野車
public class BmwYueye implements Yueye {
	public BmwYueye(){
		System.out.println("寶馬工廠生產出一輛寶馬越野車");
	}
	public void drive() {
		System.out.println("寶馬越野車");
	}
}
//生產跑車和越野車的接口
public interface CarFactory {
	public Paoche getPaoche();
	public Yueye getYueye();
}
//生產奧迪的工廠類實現CarFactory
public class AudiFactory implements CarFactory{
	@Override
	public Paoche getPaoche() {
		return new AudiPaoche();
}
	@Override
	public Yueye getYueye() {
		return new AudiYueye();
	}
}
//生產寶馬的工廠類實現CarFactory
public class BmwFactory implements CarFactory {
	@Override
	public Paoche getPaoche() {
		return new BmwPaoche();
	}
	@Override
	public Yueye getYueye() {
		return new BmwYueye();
	}
}
//測試
public class Test {
	public static void main(String[] args) {
		//實例化生產寶馬的工廠類 來上產寶馬跑車和寶馬越野車  寶馬工廠有 生產寶馬跑車和寶馬越野車  這兩個方法  具體是生產跑車還是越野車  看客戶端選擇
		CarFactory factory = new BmwFactory();
		//在這裏選擇的是生產跑車  調用的是上產跑車的方法
		Paoche paoche = factory.getPaoche();
		paoche.drive();

		CarFactory factory2 = new AudiFactory();
		Yueye yueye = factory2.getYueye();
		yueye.drive();
	}
}
輸出結果:
寶馬工廠生產出一輛寶馬跑車
寶馬跑車在路上跑
奧迪工廠生產出一輛奧迪越野車
奧迪越野車在路上跑
//寫了這麼多 希望對大家有所幫助吧 



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