Java工廠模式 工廠方法模式 抽象工廠

工廠模式

定義車的抽象類,有一個行駛的方法,所有的車都繼承這個類

/**
 * Car 抽象類
 */
public abstract class Car {
	public abstract void run();
}


定義兩輛車,奔馳和本田,繼承Car 抽象類並實現run()方法

public class BenChi extends Car {

	@Override
	public void run() {
		System.out.println("開着奔馳去泡妞...");
	}
}

 

public class BenTian extends Car {

	@Override
	public void run() {
		System.out.println("開着本田去上班...");
	}
}

創建工廠類,負責生成汽車,如果想創建汽車就使用這個類,不用自己去new了

/**
 * Car的工廠類,負責生成各種汽車
 */
public class CarFactory {
	public static Car createCar(String type){
		if("奔馳".equals(type)){
			return new BenChi();
		}else if("本田".equals(type)){
			return new BenTian();
		}
		return null;
	}
}


測試類,想創建BenChi類時,無需 Car 奔馳 = new BenChi() ;  因爲創建的過程交給了CarFactory類

public class Test {

	public static void main(String[] args) {
		Car 奔馳 = CarFactory.createCar("奔馳");
		奔馳.run();
		
		Car 本田 = CarFactory.createCar("本田");
		本田.run();
	}
}

執行輸出

開着奔馳去泡妞...
開着本田去上班...


這就是一個工廠模式,但是有一個問題,我想增加一輛QQ車時要修改CarFactory類,這樣不太好吧,寫好的代碼不應該經常修改,所以可以使用工廠方法模式。


工廠方法模式

定義生成車的接口

public interface CarFactory {
	public Car createCar();
}

創建生成XX車的工廠類,並實現CarFactory接口

/**
 * 生成奔馳的工廠類
 */
public class BenChiFactory implements CarFactory {

	@Override
	public Car createCar() {
		return new BenChi();
	}
}


 

/**
 * 生成本田的工廠類
 */
public class BenTianFactory implements CarFactory{

	@Override
	public Car createCar() {
		return new BenTian();
	}

}


 

/**
 * 生成QQ的工廠類
 */
public class QQFactory implements CarFactory{

	@Override
	public Car createCar() {
		return new QQ();
	}

}


定義車的抽象類,有一個行駛的方法,所有的車都繼承這個類

/**
 * Car 抽象類
 */
public abstract class Car {
	public abstract void run();
}

創建輛車,奔馳,本田,QQ,繼承Car 抽象類並實現run()方法

public class BenChi extends Car {

	@Override
	public void run() {
		System.out.println("開着奔馳去泡妞...");
	}
}

 

public class BenTian extends Car {

	@Override
	public void run() {
		System.out.println("開着本田去上班...");
	}
}


 

public class QQ extends Car{

	@Override
	public void run() {
		System.out.println("開着QQ送快遞...");
	}
}


測試類

public class Test {

	public static void main(String[] args) {
		
		CarFactory 奔馳工廠 = new BenChiFactory();
		Car 奔馳 = 奔馳工廠.createCar();
		奔馳.run();
		
		CarFactory 本田工廠 = new BenTianFactory();
		Car 本田 = 本田工廠.createCar();
		本田.run();
		
		CarFactory  QQ工廠= new QQFactory();
		Car qq = QQ工廠.createCar();
		qq.run(); 
	}
}

結果

開着奔馳去泡妞...
開着本田去上班...
開着QQ送快遞...


 

以後再新加車時,不需要修改以前寫好的代碼,只需要新建XXFactory實現CarFactory接口,和創建XX車類繼承Car重寫run()方法,這樣就避免了修改以前的代碼可能導致其他問題的發生

 

抽象工廠

定義抽象工廠接口AbstractFactory有兩個方法

public interface AbstractFactory {
	public Car createCar();
	public Mobile createMobile();
}

定義手機和汽車的抽象類

public abstract class Mobile {
	public abstract void call();
}

 

public abstract class Car {
	public abstract void run();
}


建一個生產高帥富的工廠類並實現AbstractFactory接口,這個工廠將生產奔馳車和蘋果手機

/**
 * 高帥富工廠
 */
public class GaoShuaiFuFactory implements AbstractFactory{

	@Override
	public Car createCar() {
		return new BenChi();
	}

	@Override
	public Mobile createMobile() {
		return new Iphone();
	}

}


創建蘋果手機類Iphone繼承Mobile類,重寫call()方法

public class Iphone extends Mobile{

	@Override
	public void call() {
		System.out.println("用蘋果手機打電話");
	}
}

創建奔馳類繼承Car類,重寫run()方法

public class BenChi extends Car {

	@Override
	public void run() {
		System.out.println("開着奔馳去泡妞...");
	}
}


測試類

public class Test {

	public static void main(String[] args) {
		AbstractFactory abstractFactory = new GaoShuaiFuFactory();
		
		Car car = abstractFactory.createCar();
		car.run();
		Mobile mobile = abstractFactory.createMobile();
		mobile.call();
		
	}

}


執行控制檯輸出

開着奔馳去泡妞...
用蘋果手機打電話


接下來我們把高帥富換成屌絲,屌絲開QQ,用小米手機

/**
 * 屌絲工廠
 */
public class DiaoSiFactory implements AbstractFactory{

	@Override
	public Car createCar() {
		return new QQ();
	}

	@Override
	public Mobile createMobile() {
		return new XiaoMi();
	}
	
}


創建小米手機類XiaoMi繼承Mobile類,重寫call()方法

public class XiaoMi extends Mobile{
	@Override
	public void call() {
		System.out.println("用小米手機打電話");
	}
}


創建QQ類繼承Car類,重寫run()方法

public class QQ extends Car{

	@Override
	public void run() {
		System.out.println("開着QQ送快遞...");
	}
}


測試類,只需要將GaoShuaiFuFactory類換成DiaoSiFactory類就行了,如果使用spring的getbean形式,代碼是不需要改的

public class Test {

	public static void main(String[] args) {
//		AbstractFactory abstractFactory = new GaoShuaiFuFactory();
		AbstractFactory abstractFactory = new DiaoSiFactory();
		
		Car car = abstractFactory.createCar();
		car.run();
		Mobile mobile = abstractFactory.createMobile();
		mobile.call();
		
	}

}


控制檯輸出

開着QQ送快遞...
用小米手機打電話


 

 

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