比如: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)
创建打印池
管理打印任务
管理打印任务
分享到:
相关推荐
如何保证一个类只有一个实例并且这个实例易于被访问呢?定义一个全局变量可以确保对象随时都可以被访问,但不能防止我们实例化多个对象。 一个更好的解决办法是让类自身负责保存它的唯一...这就是单例模式的模式动机
### 单例模式的动机 在多线程或多任务环境中,资源的有效管理和控制显得尤为重要。例如,打印机、窗口管理器、文件系统、计时工具或ID生成器等,它们往往需要在整个系统范围内保持唯一性,以避免资源冲突和数据不...
它的讲解思路为:模式动机->模式定义->模式结构->模式分析(即原理)->实例解析->模式优缺点->模式使用场景->模式应用->模式扩展。采用图文+文字+实例的方式,让读者不仅知其然,还能知其所以然。读后有种豁然开朗的...
1. 创建型模式:这类模式涉及到对象的创建,如单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式。例如,单例模式确保一个类只有一个实例,并提供全局访问点,而在C#中可以通过`Lazy<T>`类或静态类实现。...
根据提供的文件内容,我们可以深入探讨两个重要的设计模式——工厂方法模式和单例模式。下面将分别对这两种模式的定义、动机、结构以及实例进行详细解释。 ### 一、工厂方法模式 #### 模式定义 工厂方法模式是一种...
创建型模式关注对象的创建,如单例模式、工厂模式和建造者模式,它们旨在提供一种灵活的、抽象的对象创建方式。结构型模式关注如何将对象组合成更大的结构,例如适配器模式、装饰器模式和代理模式。行为型模式则涉及...
创建型模式关注对象的创建过程,如单例模式(Singleton)、工厂模式(Factory)和抽象工厂模式(Abstract Factory)等。它们提供了不同的方式来创建对象,使得对象的创建过程更加灵活,同时也隐藏了具体的实现细节。...
文档部分可能会详细讲解每个设计模式的定义、动机、结构、参与者、实现步骤和优缺点。同时,它可能会通过实例分析来阐述如何在实际项目中应用这些模式。源代码部分则提供了具体的实现,读者可以通过阅读和调试代码,...
1. 创建型模式:这类模式主要关注对象的创建过程,包括单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式。例如,单例模式确保一个类只有一个实例,并提供全局访问点;工厂方法模式定义一个用于创建对象...
- **创建型模式**:如单例模式(Singleton)、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)和原型模式(Prototype),它们主要关注对象的创建过程。 - **结构型模式...
2. **创建型模式**:这类模式主要关注对象的创建过程,包括单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式。例如,单例模式确保一个类只有一个实例,而工厂方法则提供了创建对象的接口,但让子类决定...
6. **创建型模式**:如工厂模式用于创建对象,抽象工厂模式用于创建相关或依赖对象的家族,单例模式保证一个类只有一个实例。 7. **结构型模式**:如适配器模式用于接口匹配,装饰器模式用于动态添加功能,桥接模式...
创建型模式关注对象的创建,如单例模式(Singleton)、工厂方法模式(Factory Method)和建造者模式(Builder)。单例模式确保一个类只有一个实例,并提供全局访问点;工厂方法模式则将对象的创建过程抽象出来,使得...
本文将重点介绍创建型设计模式中的几种常见模式,包括但不限于单例模式、抽象工厂模式等。 #### 二、单例模式(Singleton Pattern) **1. 动机** 在软件系统中,有时需要确保某些类在整个应用环境中只有一个实例...
1. 创建型模式:这类模式关注对象的创建过程,如单例模式(Singleton)、工厂模式(Factory)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)和原型模式(Prototype)。这些模式可以帮助我们控制对象的...
这包括工厂模式、单例模式、原型模式和创建者模式。 - 工厂模式:它提供了一种创建对象的最佳方式。通过一个工厂类,它可以根据不同的条件创建不同的对象,而不必直接使用new关键字创建。在简单工厂模式中,一个...
书中可能涵盖了23种经典的GOF(GoF,Gang of Four)设计模式,每一种模式都会包含模式的定义、动机、结构、参与者、实现方式以及优缺点分析。读者可以通过阅读这些文章,理解每个模式的核心思想,并学会在实际项目中...
常见的创建型模式有单例模式、工厂模式、抽象工厂模式、建造者模式和原型模式。 2. **结构型模式**:处理类或对象的组合,封装复杂度并增强代码的灵活性。常见的结构型模式有适配器模式、桥接模式、组合模式、装饰...
1. **单例模式**:保证一个类只有一个实例,并提供一个全局访问点,常用于配置管理、线程池等场景。 2. **工厂模式**:提供一个创建对象的接口,让子类决定实例化哪一个类,抽象工厂模式则是为其增加了一个维度,...