设计模式(二)——多例模式

/ 设计模式 / 0 条评论 / 1194浏览

简介

多例模式:在多例模式中,多例类可以有多个实例,而且多例类必须自己创建、管理自己的实例,并向外界提供自己的实例。它的实现方法和单例模式一样,通过构造函数私有化实现。

代码实现

public class Pastel {
    // 创建一个容器,实例化出来的彩色笔放在容器内
    private static HashMap<String,Pastel> pastels = new HashMap<>();

    // 生产的彩色笔可选颜色
    public static final String[] COLORS = {"red","yellow","blue"};

    // 彩色笔自己的颜色
    private String color;

    static {
        // 生产一支红色彩色笔
        Pastel redPastel = new Pastel(COLORS[0]);
        pastels.put(COLORS[0],redPastel);

        // 生产一支黄色彩色笔
        Pastel yellowPastel = new Pastel(COLORS[1]);
        pastels.put(COLORS[1],yellowPastel);

        // 生产一支蓝色彩色笔
        Pastel bluePastel = new Pastel(COLORS[2]);
        pastels.put(COLORS[2],bluePastel);
    }

    // 在创建彩色笔的时候设置颜色
    private Pastel(String color) {
        this.color = color;
    }

    // 根据颜色获得彩色笔
    public static Pastel getPastel(String color){
        return pastels.get(color);
    }

    // 给彩色笔增加一个说明,方便测试
    public void explain(){
        System.out.println("My color is "+color);
    }
}

这里我以彩色笔为例,分为红、黄、蓝三种颜色,根据颜色来获取对象。

测试

编写一个获取彩色笔的测试类

public class PastelTest {
    public static void main(String[] args) {
        Pastel redPastel = Pastel.getPastel("red");
        redPastel.explain();
        
        Pastel yellowPastel = Pastel.getPastel("yellow");
        yellowPastel.explain();
        
        Pastel bluePastel = Pastel.getPastel("blue");
        bluePastel.explain();
    }
}

输出

My color is red
My color is yellow
My color is blue

应用场景

多并发请求环境下,系统需要为每个客户端的独立请求提供单独服务的资源,但是系统总的开销是有限的,系统在并发量很大时也不可能为所有的并发请求同时提供相应的资源,否则不但系统资源消耗量大而且非常耗时。这时就可以考虑使用池的概念,也即是一种多例模式的实现。具体的应用场景,比如数据库连接池、EJB无状态会话Bean的实例池

代码实现上一般是提供一个容器类,也即是容纳资源对象的池,对象池的一些属性可以通过配置文件来配置,比如数据库连接池中容纳的Connection类型的对象数目的上限和下限、闲置连接超时时间等;然后每当应用程序请求数据库连接时,先判断池中有无空闲的连接,如有,即返回这个对象,如没有,则新建一个连接对象,并放入连接池中进行管理

微信公众号浏览体验更佳,在这里还有更多优秀文章为你奉上,快来关注吧!

北风IT之路