設計模式-抽象工廠模式

抽象工廠模式

定義

爲建立一組相關或相互依賴的對象提供一個接口,並且無須指定它們的具體類
能夠把此類工廠比作一個有多個生產線的車間,生產線產出的產品有類似的約束或者依賴的關係,
好比:我要生產汽車就須要同時生產汽車對應型號的鑰匙
uml

優勢

· 封裝性ide

高層模塊不關心產品的實現,只關心抽象,接口,
  具體的工廠類負責建立對象,而沒必要知道內部產品的關聯,以及依賴關係的實現,只須要知道工廠類便可生成一個對象

· 產品族內的約束爲非公開狀態code

對封裝性的一個補充,封裝內部約束,避免每次高層調用時都去理解內部約束的實現,也是對內部對內部約束的一個保護

· 橫向擴展容易對象

在上面UML的基礎上我須要增長一個3系列,只須要能加3系列的產品A-3和產品B-3,並增長產品3系列的工廠Product3Factory便可完成擴展

缺點

· 產品族的擴展很是困難,即垂直擴展困難,好比說在上面UML的實現的基礎上增長一個額外的產品C,我就須要修改AbstractFactory以及全部它的實現,這徹底不符合開閉原則。blog

使用場景

一個對象族(或是一組沒有任何關係的對象)都有相同的約束,則能夠使用抽象工廠模式接口

實現

  • Bmw汽車和汽車鑰匙 都受汽車系列約束
public abstract class AbstractBmwXCar {

	public abstract void getPrice();
}
public abstract class AbstractBwmXCarKey {

	public abstract void openCar() ;

}
  • 產品實現
public class BwmX5 extends AbstractBmwXCar {
	@Override
	public void getPrice() {
		System.out.println("我是X5 我要150W");
	}
}
public class BwmX6 extends AbstractBmwXCar {
	@Override
	public void getPrice() {
		System.out.println("我是X6,我要180W");
	}
}
public class X5KeyBwmX extends AbstractBwmXCarKey {

	@Override
	public void openCar() {
		System.out.println("我能打開X5的車門");
	}
}
public class X6KeyBwmX extends AbstractBwmXCarKey {
	@Override
	public void openCar() {
		System.out.println("我能打開X6的車門");
	}
}
  • 抽象工廠
public  abstract  class AbstractCarFactory {

	public abstract AbstractBmwXCar createCar();

	public abstract AbstractBwmXCarKey createKey();

}
  • 工廠實現
public class X5Factory extends AbstractCarFactory {
	@Override
	public BwmX5 createCar() {
		BwmX5 bwmX5 = new BwmX5();
		return bwmX5;
	}

	@Override
	public X5KeyBwmX createKey() {
		X5KeyBwmX x5Key = new X5KeyBwmX();
		return x5Key;
	}
}
public class X6Factory extends AbstractCarFactory {

	@Override
	public BwmX6 createCar() {
		BwmX6 bwmX6 = new BwmX6();
		return bwmX6;
	}

	@Override
	public X6KeyBwmX createKey() {
		X6KeyBwmX x6Key = new X6KeyBwmX();
		return x6Key;
	}
}
  • 客戶端調用
public class BmwCeo {

	public static void main(String[] args) {

		X5Factory x5Factory = new X5Factory();

		X6Factory x6Factory = new X6Factory();

		BwmX5 x5_1 = x5Factory.createCar();
		X5KeyBwmX x5Key = x5Factory.createKey();


		BwmX6 x6_1 = x6Factory.createCar();
		X6KeyBwmX x6Key = x6Factory.createKey();

		// 下面能夠作本身的處理了

	}
}

擴展

相關文章
相關標籤/搜索