Java作为一个优秀的编程语言,自然能解决许许多多的实际问题,为了高效的解决某一类问题就需要引入设计模式的概念。Java中一共涉及到23中设计模式。下面为大家讲述一种常用的设计模式-----单例模式。
java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。
单例模式有以下特点:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。
下面为大家贴上一个简单的例子,帮助大家梳理下思路,我以车间生产车辆实际问题为例
* @author 谢栋
* @data 2016年12月1日 下午7:59:00
*/
public class SingleDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
CarFactory car1 = CarFactory.getInstance(); //得到一个CarFactory对象
car1.getCount();
car1.getCount();
car1.getCount();
car1.getCount();
CarFactory car2 = CarFactory.getInstance(); 得到另一个CarFactory对象
car2.getCount();
car2.getCount();
car2.getCount();
}
}
/**
* 模拟车间流水线生产车的单例模式
*/
class CarFactory{
private static CarFactory car = new CarFactory();
private int count=0; //标记生产车的编号
//构造函数私有化,使CarFactory不能被new利用构造函数创建出来,防止实例被重复创建,保证单例
private CarFactory(){}
public static CarFactory getInstance(){
return car;
}
public void getCount(){
count++;
System.out.println("已经生产了 "+count+" 辆车");
}
}
/**
* 饿汉式(开发过程建议使用)
* 每次都会实例化一个对象
*/
class Single {
private static Single s =new Single(); //每次都是实例化对象
//为了保证在内存中只创建一个实例,构造方法私有化
private Single (){}
public static Single getInstance(){
return s;
}
}
/**
* 懒汉式(多线程时会产生问题)
*/
class Single2{
private static Single2 s2;
private Single2(){}
//当内存中不存在该实例时才会创建
public static Single2 getInstance(){
if(s2==null)
s2=new Single2();
return s2;
}
}
控制台显示:
已经生产了 1 辆车
已经生产了 2 辆车
已经生产了 3 辆车
已经生产了 4 辆车
已经生产了 5 辆车
已经生产了 6 辆车
已经生产了 7 辆车
在main方法中虽然是创建了两个对象CarFactory对象,但是由于是单例模式,所以生产的车的编号仍然是编号从1-7号,到此也验证了单例模式的可行性