跟着实例学习设计模式-单例模式



单例模式属于创建型设计模式。

单例模式的设计意图是:保证一个类只有一个实例,并提供一个访问它的全局访问点。

单例模式根据单例,一种是懒汉式单例。饿汉式单例在单例类被加载时候,就实例化一个对象交给自己的引用;而懒汉式在调用取得实例方法的时候才会实例化对象。

代码如下:

饿汉式:

package com.home.singleton;

/**
 * 饿汉式单例
 *
 * @author gaoxu 实践出真知!
 */
public class SingletonB {

 static SingletonB singletonB = new SingletonB();

 private SingletonB() {
 };

 public static SingletonB getInstance() {
  return singletonB;
 }

}

懒汉式:

package com.home.singleton;

/**
 * 懒汉式单例
 *
 * @author gaoxu 实践出真知!
 */
public class SingletonA {
	static SingletonA singleton = null;

	private SingletonA() {
	};

	public static synchronized SingletonA getInstance() {
		if (singleton == null) {
			return new SingletonA();
		}
		return singleton;
	}

}

单例模式是设计模式中最简单的,它有以下几个要素:

  • 私有的构造方法
  • 指向自己实例的私有静态引用
  • 以自己实例为返回值的静态的公有的方法

我们看到了如何构建一个单例类的方式了,那么在实际应用中,单单写这个一个单例类到底有什么用呢?让我们来看一个实例。

我们知道spring的IoC有两种加载方式,一种是BeanFactory一种是AppicationContext,那么我们使用单例该怎么实现IoC容器的加载呢?

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author gaoxu 实践出真知!
 */
public class SpringTools {
	protected static Logger log = LoggerFactory.getLogger(SpringTools.class);

	private ApplicationContext context;

	/**
	 * 只有被调用时才会加载
	 *
	 *
	 */
	private static class SingletionHolder {
		private static SpringTools instance = new SpringTools();
	}

	private SpringTools() {
		log.info("init spring context");
		context = new ClassPathXmlApplicationContext("application.xml");
	}

	public static ApplicationContext getContext() {
		return SingletionHolder.instance.context;
	}

}

以上代码是通过AppictionContext加载spring IoC容器的单例类,我们可以在应用程序的主启动类中做如下加载。

ApplicationContext context = SpringTools.getContext();

这样我们就可以通过接口提供的方法访问容器中的类。

单例模式的优点:

  • 在内存中只有一个对象,节省内存空间。
  • 避免频繁的创建销毁对象,可以提高性能。
  • 避免对共享资源的多重占用。
  • 可以全局访问。

通过刚才的实例,我们也可以真实的体验到单例模式的这些优点,spring IoC容器的访问在应用中相当频繁,所以单例模式加载在适合不过了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-06 20:04:42

跟着实例学习设计模式-单例模式的相关文章

跟着实例学习设计模式-静态工厂

静态工厂设计模式是创建型设计模式. 设计意图:实例化出我们需要的类对象,这些对象可以实现不同的功能,也可能只实现一个功能! 类图关系: 通过类图关系我们可以看到静态工厂负责创建OperationFather类的对象,我们来看一下实例代码. 我们是想实现一个计算器,计算器的功能暂时有加法.减法功能,以后可能随时增加新的功能如乘法.除法等.如果使用一般的做法,实际上我们写一个类就可以实现. package com.factory.staticfactory; /** * @author gaoxu

跟着实例学习设计模式(9)-桥接模式bridge(结构型)

桥接模式属于结构型设计模式. 设计意图:将抽象部分与实现部分分离,使它们都可以独立的变化. 一看到设计意图,大家可能有些发懵,我们看到的继承和接口不都是抽象和实现分离的吗?尤其是接口和抽象类都是这样的实现啊!那怎么还有这么个桥接的分离呢? 我们先来看个例子. 例如:汽车品牌内置导航仪,我们希望实现,每个品牌的导航仪都可以在任何一个牌子的汽车上安装并启动. 汽车品牌有两个:宝马.奔驰. 导航仪有三个牌子:神行者.北斗.高德. 来看正常的设计,我们肯定是会这样的采用继承来实现每个组合的安装和启动处理

跟着实例学习设计模式(8)-适配器模式adapter(结构型)

适配器模式属于结构型设计模式 设计意图:将一个类的接口转换成客户希望的另外一个接口.A d a p t e r模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 该模式正如名字一样适配器,就是为了能使之前的老接口可以焕发青春的模式,使用一个新的接口把已经存在的接口发布出去. 这样的设计模式,我们一版在企业信息化升级时会经常使用,有些企业存在的老接口经常不能对外接收数据,而重构又成本太高,那就只能使用适配器模式了,将老接口重新包装发布. 当然也有设计时就会使用的时候,大家可能不相信,不

跟着实例学习设计模式-原型模式(prototype)

原型模式是创建型模式. 设计意图:用原型实例指定创建对象的类型,并通过拷贝这个原型来创建新的对象. 我们使用构建简历的例子的类图来说明原型模式. 类图: 原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype.这里我们定义了一个抽象的原型接口,声明了用于clone自己的方法,这里我们已创建简历为具体原型类,Prototype类需要具备以下两个条件: 实现Cloneable接口.在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现

跟着实例学习设计模式-生成器模式(builder)

生成器模式是创建型设计模式. 设计意图:将一个复杂的类表示与其构造相分离,使得相同的构建过程能够得出不同的表示. 实例类图: IVehicleBuilder:抽象建造者,为创建一个Vehicle对象并创建它的相关部件指定的抽象接口,把产品的生产过程分解为不同的步骤,从而使具体的建造者在具体的建造步骤上具有更多弹性,从而创造出不同表示的产品.(这里就是小车和卡车) CarBuilder.TrunkBuilder:具体建造者,实现IVehicleBuilder接口,构造和装配产品的各个部件定义并明确

跟着实例学习设计模式(3)-工厂方法(创建型)

工厂方法属于创建型设计模式. 设计意图:定义一个用于创建对象的接口.让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 静态工厂使用面向对象的方式,有效的攻克了添加新产品给client和实现类带来的代码改动问题.封装了创建过程,减低了添加新产品带来的代码改动错误.可是新增功能须要改动client代码和工厂创建类的推断逻辑,这种设计违背了开放-封闭原则.对扩展开放.对改动封闭,那我们就须要找一种方式避免添加新的功能时改动工厂创建方法的逻辑.(毕竟会对原有代码做改动难免会有失误) 工厂

跟着实例学习设计模式(4)-抽象工厂(创建型)

抽象工厂属于创建型设计模式 设计意图:提供一个接口.能够创建一系列相关或相互依赖的对象,而无须指定它们详细的类. 光看设计意图有些抽象,不好理解.让我们来看一下实例类图,结合类图我们再做详细的解释,相信会让大家豁然开朗的.我们以生产汽车为例,我们生产的汽车分两个系列,小车.卡车,每一个系列汽车都有发动机和油箱. 上图: IAbstrcatFactory:抽象工厂接口,声明创建抽象产品的方法. CarFactory:小车工厂实现类. TrunkFactory:卡车工厂实现类. 这里我们为每一个系列

跟着实例学习设计模式-抽象工厂

抽象工厂属于创建型设计模式 设计意图:提供一个接口,可以创建一系列相关或相互依赖的对象,而无须指定它们具体的类. 光看设计意图有些抽象,不好理解,让我们来看一下实例类图,结合类图我们再做具体的解释,相信会让大家豁然开朗的.我们以生产汽车为例,我们生产的汽车分两个系列,小车.卡车,每个系列汽车都有发动机和油箱. 上图: IAbstrcatFactory:抽象工厂接口,声明创建抽象产品的方法. CarFactory:小车工厂实现类. TrunkFactory:卡车工厂实现类. 这里我们为每个系列提供

跟着实例学习设计模式-工厂方法

工厂方法属于创建型设计模式. 设计意图:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 静态工厂使用面向对象的方式,有效的解决了增加新产品给客户端和实现类带来的代码修改问题,封装了创建过程,减低了增加新产品带来的代码修改错误,但是新增功能需要修改客户端代码和工厂创建类的判断逻辑,这样的设计违背了开放-封闭原则,对扩展开放,对修改封闭,那我们就需要找一种方式避免增加新的功能时修改工厂创建方法的逻辑.(毕竟会对原有代码做修改难免会有失误) 工厂方法就是有