一、结构图           二、适用性         1、一个应用独立于一产品创建、组合的时候;         2、一个应用要用多个产品中某一产品来进行配置的时候;         3、当你要强调一系列相关的产品对象的设计以便进行联合使用的时候;         4、当你提供一个产品类库,而只想显示它们的接口而不是实现的时候。
  三、目的         提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 四、个人感受         抽象工厂模式应该多用于组合,当用不同对象构建另一对象的时候可以把这些全部抽象出来,以便于更多样化的组合;这样保证生成对象的多样性,程序的扩展性增强;此外、可以把一些方法的实现封装起来,形成接口,通过配置或者其他方式,来进行接口的实现。等等。 五、java实现 1、RoomMaker类 public class RoomMaker  { 
     public Room CreateRoom(String roomType) {         if(roomType.equals("LivingRoom")) {             return new LivingRoom();         } else if(roomType.equals("BedRoom")) {             return new BedRoom();         } else {             return new LivingRoom();         }     } 
    public static void main(String[] args) {         RoomMaker myMaker = new RoomMaker();         //-----  Create Living Room         Room myLivingRoom = myMaker.CreateRoom("LivingRoom");         //-----  Create a door in living room         Door livingDoor = myLivingRoom.makeDoor();         System.out.println("Living room door name is:" + livingDoor.getName() );         //-----  Create a wall in living room         Wall livingWall = myLivingRoom.makeWall();         System.out.println("Living room wall name is:" + livingWall.getName() ); 
        //-----  Create Bed Room         Room myBedRoom = myMaker.CreateRoom("BedRoom");         //-----  Create a door in bedroom         Door BedDoor = myBedRoom.makeDoor();         System.out.println("Bed room door name is:" + BedDoor.getName() );         //-----  Create a wall in bedroom         Wall BedWall = myBedRoom.makeWall();         System.out.println("Bed room wall name is:" + BedWall.getName() ); 
    }      } 2、Room类 public abstract  class Room  {     public abstract Wall makeWall();     public abstract Door makeDoor(); } 3、Wall类 public abstract class Wall  {     //private Wall wall;     public abstract String getName(); } 4、Door类 public abstract class Door  {     //private Door door;     public abstract String getName() ; } 5、BedRoom类 public class BedRoom  extends Room {     public BedRoom() {         System.out.println("Initiated a bedroom !");     }     public Door makeDoor() {         return new BedRoomDoor();     }     public Wall makeWall() {         return new BedRoomWall();     } } 6、LivingRoom类 public class LivingRoom  extends Room {     public LivingRoom() {         System.out.println("Initiated a living room !");     }     public Door makeDoor() {         return new LivingRoomDoor();     }     public Wall makeWall() {         return new LivingRoomWall();     } } 7、BedRoomDoor类 public class BedRoomDoor extends Door {     private String doorName;     public BedRoomDoor() {         doorName = "BedRoomDoor";     }     public String getName() {         return doorName;     } } 8、BedRoomWall类 public class BedRoomWall extends Wall {     private String wallName;     public BedRoomWall() {         wallName = "BedRoomWall";     }     public String getName() {         return wallName;     } } 9、LivingRoomDoor类 public class LivingRoomDoor extends Door {     private String doorName;     public LivingRoomDoor() {         doorName = "LivingRoomDoor";     }     public String getName() {         return doorName;     } } 10、LivingRoomWall类 public class LivingRoomWall  extends Wall {     private String wallName;     public LivingRoomWall() {         wallName = "LivingRoomWall";     }     public String getName() {         return wallName;     } }  
 
  |