什么是设计模式?
针对于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);
}
}
在页面上测试拿到存的值 刷新一次就会加一次