1. 程式人生 > >java設計模式--抽象工廠模式

java設計模式--抽象工廠模式

1 背景

    上一章節我們說到了造車,當是客戶經理忘記了一件很重要的事情,忘記車還分手動擋和自動擋了,所有這次就用抽象工廠來實現了。

    然後我們就開始分析了,首先當然是車啦,然後各種型號下又分別有手動擋和自動擋

2 UML


程式碼:

/**
 * 車
 * @author pengkun
 *
 */
public interface Car {
	void getCar();
}

/**
 * 秦
 * @author pengkun
 *
 */
public abstract class QinCar implements Car {

	@Override
	public void getCar() {
		System.out.println("製造了一輛比亞迪秦");
	}

}


public class QinCarSD extends QinCar {
	@Override
	public void getCar() {
		System.out.println("製造了一輛比亞迪秦,手動擋");
	}
}

public class QinCarZD extends QinCar {
	@Override
	public void getCar() {
		System.out.println("製造了一輛比亞迪秦,自動擋");
	}
}
//這裡就寫一種型別了。。其他類似省略了

工廠

public interface AbstractFactoryCar {
	Car createQin();
	Car createTang();
	Car createSong();
}

/**
 * 手動擋
 * @author pengkun
 *
 */
public class SDAbstractFactory implements AbstractFactoryCar {

	@Override
	public Car createQin() {
		return new QinCarSD();
	}

	@Override
	public Car createTang() {
		return new TangCarSD();
	}

	@Override
	public Car createSong() {
		return new SongCarSD();
	}

}

/**
 * 自動擋
 * @author pengkun
 *
 */
public class ZDAbstractFactory implements AbstractFactoryCar {

	@Override
	public Car createQin() {
		return new QinCarZD();
	}

	@Override
	public Car createTang() {
		return new TangCarZD();
	}

	@Override
	public Car createSong() {
		return new SongCarZD();
	}

}

測試:


	@Test
	public void test() {
		AbstractFactoryCar factorySD=new SDAbstractFactory();
		AbstractFactoryCar factoryZD=new ZDAbstractFactory();
		Car sd1=factorySD.createQin();
		Car sd2=factorySD.createTang();
		sd1.getCar();
		sd2.getCar();
		
		Car zd1=factoryZD.createQin();
		Car zd2=factoryZD.createTang();
		zd1.getCar();
		zd2.getCar();
	}

結果:

製造了一輛比亞迪秦,手動擋
製造了一輛比亞迪唐,手動擋
製造了一輛比亞迪秦,自動擋
製造了一輛比亞迪唐,自動擋

總結:

優點

       封裝性。每個產品的實現類不是高層模組要關心的,它要關心的是介面,是抽象,它不關心物件是如何創建出來的,這都由工廠類負責的,只要知道工廠類是誰,我就能建立一個需要的物件,省時省力。

缺點

        抽象工廠模式最大的缺點就是產品族擴充套件非常困難。如果我們要增加一個產品C,也就是說產品族由原來的A和B增加到3個,那麼我們首先要在抽象類AbstractCreator中增加createProductC()方法,然後兩個實現類都要修改……說到這裡,已經知道了擴充套件的弊端了……

        注意這裡是產品族擴充套件比較困難,而不是產品等級擴充套件困難。產品等級擴充套件還是非常容易的,增加一個產品等級,只要增加一個工廠類負責新增加出來的產品生產任務即可。也就是說橫向擴充套件容易,縱向擴充套件難。