设计模式之单例模式

什么是设计模式?

针对于Java编程三大特点演变的一个编码风格。

定义:

Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。 

在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作。

还有, singleton能够被状态化; 这样,多个单态类在一起就可以作为一个状态仓库一样向外提供服务,比如,你要论坛中的帖子计数器,每次浏览一次需要计数,单态类能否保持住这个计数,并且能synchronize的安全自动加1,如果你要把这个数字永久保存到数据库,你可以在不修改单态接口的情况下方便的做到。

Singleton模式就为我们提供了这样实现的可能。使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收(garbage collection)。

我们常常看到工厂模式中类装入器(class loader)中也用Singleton模式实现的,因为被装入的类实际也属于资源。

了解设计模式地址:

https://www.cnblogs.com/zyrblog/tag/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/

饱含式

//把类变成单例   懒汉式也是饱汉式 需要用才加载
public class MyApp {
    int count=0;

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    private MyApp(){//构造器私有化 外部就不能new 只能内部调用
    }

    private static MyApp myApp=new MyApp();//只new一个

    public static MyApp newInstance(){//内方法 调用就用这个方法去new
        return myApp;//返回上面new的实例
    }

    public static void main(String[] args) {
        MyApp myApp=MyApp.newInstance();
        MyApp myApp2=MyApp.newInstance();
        System.out.println(myApp==myApp2);//单例只new一个实例 true
    }
}

懒汉式  一般来说第一种要相当于安全一些

//    定义一个私有构造器,这样的话就不能通过new关键字在外部所实例化
    private Singletons(){}

//    在jvm中创建该类的一个实例
    private static Singletons singletons = null;

//    在外部通过调用此方法,访问该类的仅有的一个实例,达到该类资源共享的一个效果
    public static synchronized Singletons getInstance(){
        if(null == singletons)
            singletons = new Singletons();
        return singletons;

    }

 

需要使用单例的地方 比如网站访问量 一般是用application去做 就是单例的

网站中的所有请求用到的application都是同一个,所以我们可以那它用来统计访问量

可以自己简单写一个类 模拟网站访问 只要调用一次这个方法就加一次

  @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       int count=(int)req.getServletContext().getAttribute("count");//获取到全局上下文当前访问量值
        req.getServletContext().setAttribute("count",count+1);//每访问一次count值就加1

        //自己定义的  单例模式就是一个资源被多个使用 共享资源
        MyApp myApp=MyApp.newInstance();
        myApp.setCount(myApp.getCount()+1);//第一次拿到count等于1 访问一次加1
        req.setAttribute("count2",myApp.getCount());//得到每一次count
        req.getRequestDispatcher("/index.jsp").forward(req,resp);
    }
}

在页面上测试拿到存的值 刷新一次就会加一次

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值