抽象工廠模式的适用:
一個系統要獨立于它的産品的建立、組合和表示時。
一個系統要由多個産品系列中的一個來配置時。
當你要強調一系列相關的産品對象的設計以便進行聯合使用時。
當你提供一個産品類庫,而隻想顯示它們的接口而不是實作時。
示例說明:
有三種抽象的産品:牆、門、房間。
對這三種抽象産品有兩組具體實作:卧室和起房間。
那麼,我們的抽象工廠就可以根據客戶的指令(即調用參數)去生産卧室和起房間的房間(牆和門包括在房間裡)。
測試啟動類:
package com.alex.designpattern.abstractfactory;
/** *//**
* 抽象工廠模式
* <p>
* 提供一個建立一系列相關或互相依賴對象的接口,而無需指定它們具體的類。
*
* @serialData 2007
*/
public class Test ...{
public static void main(String[] args) throws Exception ...{
// ----- Create Living Room
Room myLivingRoom = AbstractRoomFactory.createRoom("LivingRoom");
AbstractRoomFactory.showRoom(myLivingRoom);
// ----- Create Bed Room
Room myBedRoom = AbstractRoomFactory.createRoom("BedRoom");
AbstractRoomFactory.showRoom(myBedRoom);
}
}
抽象産品:
* The Abstract Class of Wall
public interface Wall ...{
public String getName();
* The Abstract Class of Door
public interface Door ...{
* The Abstract Class of Room
public interface Room ...{
public Wall getWall();
public Door getDoor();
實際産品_1
* A concrete Room - Bed Room
public class BedRoom implements Room ...{
public BedRoom() ...{
System.out.println("Initiated a bedroom.");
public Door getDoor() ...{
return new BedRoomDoor();
public Wall getWall() ...{
return new BedRoomWall();
* A concrete Door for Bed Room
public class BedRoomDoor implements Door ...{
private String doorName;
public BedRoomDoor() ...{
doorName = "BedRoomDoor";
public String getName() ...{
return doorName;
* A concrete Wall for Bed Room
public class BedRoomWall implements Wall ...{
private String wallName;
public BedRoomWall() ...{
wallName = "BedRoomWall";
return wallName;
實際産品_2
* A concrete Room - Living Room
public class LivingRoom implements Room ...{
public LivingRoom() ...{
System.out.println("Initiated a livingroom.");
return new LivingRoomDoor();
return new LivingRoomWall();
* A concrete Door for Living Room
public class LivingRoomDoor implements Door ...{
public LivingRoomDoor() ...{
doorName = "LivingRoomDoor";
* A concrete Wall for Living Room
public class LivingRoomWall implements Wall ...{
public LivingRoomWall() ...{
wallName = "LivingRoomWall";
最後,當然就是抽象工廠咯,不過要注意,這個抽象工廠的意思并不是這個“工廠”是抽象的,而是這個“工廠”加工的“産品”是來自于抽象的。
* A Room Maker to test our simple Room Abstract Factory.
public abstract class AbstractRoomFactory ...{
public static Room createRoom(String roomType) throws Exception ...{
if (roomType.equals("LivingRoom")) ...{
return new LivingRoom();
} else if (roomType.equals("BedRoom")) ...{
return new BedRoom();
} else ...{
throw new Exception("No this type room: " + roomType);
}
public static void showRoom(Room room) ...{
Door door = room.getDoor();
System.out.println("Room door name is: " + door.getName());
Wall wall = room.getWall();
System.out.println("Room wall name is: " + wall.getName());
本文轉自胡奇 51CTO部落格,原文連結:http://blog.51cto.com/huqicto/280900,如需轉載請自行聯系原作者