`
tesia
  • 浏览: 31884 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

单例模式动机与定义

阅读更多
  比如:windows窗口只能打开一个任务管理器。就是说整个系统只有唯一一个实例。

动机: 定义一个全局变量可以确定对象随时都可以被访问,但不能防止我们实例化多个对象。最好的解决办法是自身负责保存它的唯一实例。 保证没有被其他实例创建,并且它可以提供一个访问该实例的方法。
         
定义:确保某个类只有一个实例,自行实例化并向整个系统提供这个实例,这个类称为实例类,它提供全局访问方法。

单例模式是最简单的模式,它只包含一个类,即单例类。实例方法(对象方法)
要点有三个:一个类只有一个实例 ,必须自行创建这个实例, 它必须自行向整个系统提供这个实例。


package singleton;

public class Singleton {

private static Singleton instance=null; //静态私有成员变量
  //私有构造函数
private Singleton(){

}

//静态公有工厂方法,返回唯一实例
public static Singleton getSingleton(){
if (instance==null) {
instance=new Singleton();
}
return instance;
}

/**
  * 测试单例类所创建的对象的唯一性
  * @param args
  */
public static void main(String[] args) {
Singleton s1=Singleton.getSingleton();
Singleton s2=Singleton.getSingleton();
if(s1==s2){
System.out.println("创建的实例对象唯一");
}
}
}


使用情况:

package pattern.singleton;

/**
* 单例类 (除了静态工厂方法外,还包含了其他业务方法)
* @author Administrator
*
*/
public class IdentityCardNo {
private static IdentityCardNo instance=null;//静态私有成员变量
private String identityCardNo;
//私有构造函数
private IdentityCardNo(){

}

public String getIdentityCardNo() {
return identityCardNo;
}

public void setIdentityCardNo(String identityCardNo) {
this.identityCardNo = identityCardNo;
}
   //静态工厂方法
public static IdentityCardNo getInstance(){
//判断如果不存在,就实例化一个新的对象。否则返回已经存在的
if(instance==null){
System.out.println("首次办理身份证,分配新号码");
instance=new IdentityCardNo();
instance.setIdentityCardNo("no222211110000");
}else{
System.out.println("重复办理,获取旧号");
}
return instance;
}

}


测试类:
package pattern.singleton;
/**
* 测试获取身份证号码
* @author Administrator
*
*/
public class ClientTest {
public static void main(String[] args) {
IdentityCardNo No1,No2;
No1=IdentityCardNo.getInstance(); //获取实例对象
No2=IdentityCardNo.getInstance();
System.out.println("身份证号码是否一致:"+(No1==No2));

String str1,str2;
str1=No1.getIdentityCardNo(); //获取对象中的属性号码
str2=No2.getIdentityCardNo();
System.out.println("第一次号码:"+str1);
System.out.println("第二次号码:"+str2);
System.out.println("是否是相同对象:"+(str1==str2));
System.out.println("内容是否一致:"+str1.equalsIgnoreCase(str2));
// 控制台输出结果:
// 身份证号码是否一致:true
// 第一次号码:no222211110000
// 第二次号码:no222211110000
// 是否是相同对象:true
// 内容是否一致:true

}
}
===============================================================
单例模式应用---自定义打印池:

package pattern.singleton;
/**
* 自定义打印池异常
* 打印池是用于管理打印任务的应用程序
* 操作系统中只许运行一个打印池对象,如果重复创建打印池则抛出异常
* @author Administrator
*
*/
public class PrintSpoolerException extends Exception{
/**
*
*/
private static final long serialVersionUID = 1L;

public PrintSpoolerException(String message){
super(message);
}
}
-----------------------------------------------
package pattern.singleton;

/**
* 打印池单例类
* @author Administrator
*
*/
public class PrintSpoolerSingleton {
   private static PrintSpoolerSingleton instance=null;
   private PrintSpoolerSingleton(){
  
   }
   public static PrintSpoolerSingleton getInstance(){
   try {
     if (instance==null) {
     System.out.println("创建打印池");
     instance=new PrintSpoolerSingleton();
      }else{
  throw new PrintSpoolerException("打印池正在工作中");
      }
} catch (PrintSpoolerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
   return instance;
   }
  
   public void mangageJobs(){
   System.out.println("管理打印任务");
   }
}

----test method

public static void main(String[] args) throws PrintSpoolerException {

         PrintSpoolerSingleton ps1,ps2;
         ps1=PrintSpoolerSingleton.getInstance();
         ps1.mangageJobs();
   
ps2=PrintSpoolerSingleton.getInstance();
ps2.mangageJobs();


}

-----控制台输出
pattern.singleton.PrintSpoolerException: 打印池正在工作中
at pattern.singleton.PrintSpoolerSingleton.getInstance(PrintSpoolerSingleton.java:19)
at pattern.singleton.ClientTest.main(ClientTest.java:26)
创建打印池
管理打印任务
管理打印任务
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics