天天看點

23種經典設計模式的java實作_1_抽象工廠模式

抽象工廠模式的适用:

一個系統要獨立于它的産品的建立、組合和表示時。

一個系統要由多個産品系列中的一個來配置時。

當你要強調一系列相關的産品對象的設計以便進行聯合使用時。 

當你提供一個産品類庫,而隻想顯示它們的接口而不是實作時。

示例說明:

有三種抽象的産品:牆、門、房間。

對這三種抽象産品有兩組具體實作:卧室和起房間。

那麼,我們的抽象工廠就可以根據客戶的指令(即調用參數)去生産卧室和起房間的房間(牆和門包括在房間裡)。

測試啟動類:

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,如需轉載請自行聯系原作者