23种经典设计模式的java实现_1_抽象工厂模式

简介:
抽象工厂模式的适用:
一个系统要独立于它的产品的创建、组合和表示时。
一个系统要由多个产品系列中的一个来配置时。
当你要强调一系列相关的产品对象的设计以便进行联合使用时。 
当你提供一个产品类库,而只想显示它们的接口而不是实现时。
示例说明:
有三种抽象的产品:墙、门、房间。
对这三种抽象产品有两组具体实现:卧室和起居室。
那么,我们的抽象工厂就可以根据客户的指令(即调用参数)去生产卧室和起居室的房间(墙和门包括在房间里)。
测试启动类:
package com.alex.designpattern.abstractfactory;
/** *//**
 * 抽象工厂模式
 * <p>
 * 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
 * 
 * @author <a href=" huqimailto:huqiyes@gmail.com">huqi</a>
 * @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);
    }
}
抽象产品:
package com.alex.designpattern.abstractfactory;
/** *//**
 * The Abstract Class of Wall
 */
public interface Wall ...{
    public String getName();
}
package com.alex.designpattern.abstractfactory;
/** *//**
 * The Abstract Class of Door
 */
public interface Door ...{
    public String getName();
}
package com.alex.designpattern.abstractfactory;
/** *//**
 * The Abstract Class of Room
 */
public interface Room ...{
    public Wall getWall();
    public Door getDoor();
}
实际产品_1
package com.alex.designpattern.abstractfactory;
/** *//**
 * 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();
    }
}
package com.alex.designpattern.abstractfactory;
/** *//**
 * A concrete Door for Bed Room
 */
public class BedRoomDoor implements Door ...{
    private String doorName;
    public BedRoomDoor() ...{
        doorName = "BedRoomDoor";
    }
    public String getName() ...{
        return doorName;
    }
}
package com.alex.designpattern.abstractfactory;
/** *//**
 * A concrete Wall for Bed Room
 */
public class BedRoomWall implements Wall ...{
    private String wallName;
    public BedRoomWall() ...{
        wallName = "BedRoomWall";
    }
    public String getName() ...{
        return wallName;
    }
}
实际产品_2
package com.alex.designpattern.abstractfactory;
/** *//**
 * A concrete Room - Living Room
 */
public class LivingRoom implements Room ...{
    public LivingRoom() ...{
        System.out.println("Initiated a livingroom.");
    }
    public Door getDoor() ...{
        return new LivingRoomDoor();
    }
    public Wall getWall() ...{
        return new LivingRoomWall();
    }
}
package com.alex.designpattern.abstractfactory;
/** *//**
 * A concrete Door for Living Room
 */
public class LivingRoomDoor implements Door ...{
    private String doorName;
    public LivingRoomDoor() ...{
        doorName = "LivingRoomDoor";
    }
    public String getName() ...{
        return doorName;
    }
}
package com.alex.designpattern.abstractfactory;
/** *//**
 * A concrete Wall for Living Room
 */
public class LivingRoomWall implements Wall ...{
    private String wallName;
    public LivingRoomWall() ...{
        wallName = "LivingRoomWall";
    }
    public String getName() ...{
        return wallName;
    }
}
最后,当然就是抽象工厂咯,不过要注意,这个抽象工厂的意思并不是这个“工厂”是抽象的,而是这个“工厂”加工的“产品”是来自于抽象的。
package com.alex.designpattern.abstractfactory;
/** *//**
 * A Room Maker to test our simple Room Abstract Factory.
 * 
 * @author <a href=" huqimailto:huqiyes@gmail.com">huqi</a>
 * @serialData 2007
 */
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,如需转载请自行联系原作者



相关文章
|
3天前
|
设计模式 Java
【设计模式系列笔记】抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是一种设计模式,属于创建型模式之一。它提供了一种方式来创建一系列相关或相互依赖的对象,而无需指定它们具体的类。抽象工厂模式通过引入抽象的工厂接口,使得客户端代码可以使用抽象的接口来创建一组相关的产品,而不关心这些产品的具体实现。
98 4
|
17天前
|
设计模式 监控 Java
设计模式 - 观察者模式(Observer):Java中的战术与策略
【4月更文挑战第7天】观察者模式是构建可维护、可扩展系统的关键,它在Java中通过`Observable`和`Observer`实现对象间一对多的依赖关系,常用于事件处理、数据绑定和同步。该模式支持事件驱动架构、数据同步和实时系统,但需注意避免循环依赖、控制通知粒度,并关注性能和内存泄漏问题。通过明确角色、使用抽象和管理观察者注册,可最大化其效果。
|
6天前
|
设计模式 算法 Java
Java中的设计模式及其应用
【4月更文挑战第18天】本文介绍了Java设计模式的重要性及分类,包括创建型、结构型和行为型模式。创建型模式如单例、工厂方法用于对象创建;结构型模式如适配器、组合关注对象组合;行为型模式如策略、观察者关注对象交互。文中还举例说明了单例模式在配置管理器中的应用,工厂方法在图形编辑器中的使用,以及策略模式在电商折扣计算中的实践。设计模式能提升代码可读性、可维护性和可扩展性,是Java开发者的必备知识。
|
9天前
|
设计模式 算法 Java
小谈设计模式(30)—Java设计模式总结
小谈设计模式(30)—Java设计模式总结
|
10天前
|
设计模式 存储 Java
Java设计模式:解释一下单例模式(Singleton Pattern)。
`Singleton Pattern`是Java中的创建型设计模式,确保类只有一个实例并提供全局访问点。它通过私有化构造函数,用静态方法返回唯一的实例。类内静态变量存储此实例,对外仅通过静态方法访问。
15 1
|
14天前
|
设计模式 算法 Java
23种设计模式,模板方法模式的概念优缺点以及JAVA代码举例
【4月更文挑战第10天】模板方法模式是一种行为设计模式,它定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些特定步骤。
14 0
|
15天前
|
设计模式 Java
23种设计模式,状态模式的概念优缺点以及JAVA代码举例
【4月更文挑战第9天】状态模式是一种行为设计模式,允许一个对象在其内部状态改变时改变它的行为,这个对象看起来似乎修改了它的类。
28 4
|
16天前
|
设计模式 Java
23种设计模式,命令模式的概念优缺点以及JAVA代码举例
【4月更文挑战第7天】命令模式是一种行为设计模式,它将请求或简单操作封装为一个对象。这种模式允许用户通过调用对象来参数化其他对象的方法,并能保存、排队和执行方法调用。
21 1
|
1天前
|
安全 Java 调度
Java线程:深入理解与实战应用
Java线程:深入理解与实战应用
9 0